두 개의 스레드가 실행되는 버튼을 누르면 Windows 양식을 제어하는 주 스레드가 있습니다. 하나는 정보를 기록하는 데 사용되고 다른 하나는 정보를 읽는 데 사용됩니다. 이들을 스레드에 넣는 아이디어는 사용자가 실행 중에 인터페이스와 상호 작용할 수있게하는 것입니다.두 개의 스레드를 시작하면 순서가 아니라 동시에 실행됩니다.
여기에 두 개의 스레드가 생성됩니다.
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) { }
실행 입니다. 그러나 그것은 주어진 방법으로 가지 않을 것입니다.
아이디어가 있으십니까?
: 스레드에 의해 호출되는 두 가지 기능은 다음과 같습니다.
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
문제를 보여주는 짧지만 완전한 * 프로그램을 보여주십시오. –
더 많은 코드를 보여주십시오, 이것은 충분하지 않습니다 –