У меня есть основной поток, который управляет формой окна, при нажатии кнопки выполняются два потока. Один используется для записи информации, другой используется для его чтения. Идея положить их в потоки - это позволить пользователю взаимодействовать с интерфейсом во время выполнения.Запуск двух потоков запускает их последовательно и не в одно и то же время
Вот создание двух потоков;
Thread recordThread = new Thread(() => RecordData(data));
recordThread.Name = "record";
recordThread.Start();
Thread readThread = new Thread(() => ReadData(data));
readThread.Name = "read";
readThread.Start();
В данные просто данных объект, который хранит данные, записанные во время записи.
Проблема, с которой я столкнулась, заключается в том, что первый поток выполняется отлично, второй отказывается работать до тех пор, пока первый не завершится. Помещение контрольной точки во вторую функцию потоков, ReadData позволяет мне знать, что она вызывается только после того, как первый поток выполняется со всей его записью.
Я пытался решить это в течение нескольких часов, и я не могу понять, почему он это сделает. Добавление a;
while(readThread.IsAlive) { }
сразу после начала приостановит выполнение чего-либо после этого, и это состояние Запуск. Но это не будет идти к данному методу.
Любые идеи?
Редактировать: Две функции, вызываемые потоками;
private void RecordData(Data d)
{
int i = 0;
while (i < time * freq)
{
double[] data = daq.Read();
d.AddData(data);
i++;
}
}
private void ReadData(Data d)
{
UpdateLabelDelegate updateData =
new UpdateLabelDelegate(UpdateLabel);
int i = 0;
while (i < time * freq)
{
double[] data = d.ReadLastData();
this.Invoke(updateData, new object[] { data });
i++;
}
}
данные объект имеет замок в обеих функций, которые призваны; ReadLastData и Read.
Вот методы в Данные объект.
public void AddData(double[] data)
{
lock (this)
{
int i = 0;
foreach (double d in data)
{
movementData[i].Add(d);
i++;
}
}
}
public double[] ReadLastData()
{
double[] data = new double[channels];
lock (this)
{
int i = 0;
foreach (List<double> list in movementData)
{
data[i] = list[list.Count - 1];
}
}
return data;
}
Это зависит от того, ожидает ли второй поток ресурс, заблокированный первым потоком (угадывание 'данных'). Какой замок у вас есть? – Belogix
Пожалуйста, покажите короткую, но * полную * программу, демонстрирующую проблему. –
Пожалуйста, покажите больше кода, этого недостаточно –