Windowsフォームを制御するメインスレッドがあり、ボタンを押すと2つのスレッドが実行されます。1 つは情報を記録するために使用され、もう 1 つはそれを読み取るために使用されます。これらをスレッドに入れる背後にある考え方は、実行中にユーザーがインターフェースと対話できるようにすることです。
これが 2 つのスレッドの作成です。
Thread recordThread = new Thread(() => RecordData(data));
recordThread.Name = "record";
recordThread.Start();
Thread readThread = new Thread(() => ReadData(data));
readThread.Name = "read";
readThread.Start();
データは、記録中に記録されるデータを格納する単純なデータ オブジェクトです。
私が直面している問題は、最初のスレッドが正常に実行され、2 番目のスレッドが最初のスレッドが完了するまで実行を拒否することです。2 番目のスレッド関数にブレークポイントを設定すると、ReadDataによって、最初のスレッドがすべての記録を完了した後にのみ呼び出されることがわかります。
私はこれを数時間解決しようとしてきましたが、なぜこれを行うのか理解できません。を追加します。
while(readThread.IsAlive) { }
開始直後はその後の実行を停止し、状態はRunningです。しかし、それは与えられた方法には行きません。
何か案は?
編集:スレッドによって呼び出される2つの関数は次のとおりです。
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。
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;
}