我有一个控制窗口窗体的主线程,按下按钮时会执行两个线程。一个用于记录信息,另一个用于读取信息。将这些放入线程背后的想法是使用户能够在执行时与界面进行交互。
这是两个线程的创建;
Thread recordThread = new Thread(() => RecordData(data));
recordThread.Name = "record";
recordThread.Start();
Thread readThread = new Thread(() => ReadData(data));
readThread.Name = "read";
readThread.Start();
数据只是一个数据对象,用于存储在记录过程中记录的数据。
我面临的问题是第一个线程执行得很好,第二个拒绝运行,直到第一个完成。在第二个线程函数中放置一个断点,ReadData让我知道只有在第一个线程完成所有记录后才调用它。
我已经尝试解决这个问题几个小时了,但我无法理解它为什么会这样做。添加一个;
while(readThread.IsAlive) { }
在 start 之后将停止执行之后的任何操作,并且它的状态是Running。但它不会去给定的方法。
有任何想法吗?
编辑:线程调用的两个函数是;
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 和读取。
以下是Data对象中的方法。
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;
}