2013-05-09 36 views
0

我试图控制一块测试设备,并且我需要确定如何与其进行通信的顺序正确。为什么这个线程永无止境?

首先我打电话StartGettingTraceData()。然后在将来的某个时间,我会呼叫StopGettingTraceData()尝试结束GetTraceData()函数,而不是重新启动它自己。但是,永远不会发生。其实我从来没有去过线DoneTraces.Set()所以就行bool timedOut = !DoneTraces.WaitOne(10000)timedOut总是如此;

private static AutoResetEvent DoneTraces = new AutoResetEvent(false); 

private void GetTraceData() 
{ 
    byte[] receivedbytes = new byte[1]; 
    if (Connection.ReadData(receivedbytes) && receivedbytes[0] == 192) 
     ProcessIncomingTrace(); 

    Thread.Sleep(100); 

    if (RunTraceQueryWorker) 
     new Thread(GetTraceData).Start(); 
    else 
    { 
     Thread.Sleep(200); 
     DoneTraces.Set(); 
    } 
} 

private void StartGettingTraceData() 
{ 
    RunTraceQueryWorker = true; 
    new Thread(GetTraceData).Start(); 
} 

private bool StopGettingTraceData() 
{ 
    RunTraceQueryWorker = false; 
    bool timedOut = !DoneTraces.WaitOne(10000); 
    return timedOut; 
} 

对发生了什么有什么想法?

编辑:

这是我Connection.ReadData(...)函数。顺便说一句,这是一个串行连接。

public bool ReadData(byte[] responseBytes) 
{ 
    int bytesExpected = responseBytes.Length, offset = 0, bytesRead; 
    while (bytesExpected > 0 && (bytesRead = MySerialPort.Read(responseBytes, offset, bytesExpected)) > 0) 
    { 
     offset += bytesRead; 
     bytesExpected -= bytesRead; 
    } 
    return bytesExpected == 0; 
} 
+1

线程很贵,所以你不应该递归地创建它们。有这么多的线程(做'睡眠()')可能也是你不停的问题。 – 2013-05-09 14:46:46

+0

您是否尝试过使用DataReceived事件处理程序?我昨天看了这本手册,看起来非常直截了当,除了可能的不同反应之外。 – dbasnett 2013-05-09 15:05:20

回答

1

不是recusively再打电话给GetTraceData,你应该使用while循环看着你的病情是这样的:

private static AutoResetEvent DoneTraces = new AutoResetEvent(false); 

private void GetTraceData() 
{ 
    do 
{ 
    byte[] receivedbytes = new byte[1]; 
    if (Connection.ReadData(receivedbytes) && receivedbytes[0] == 192) 
     ProcessIncomingTrace(); 

    Thread.Sleep(100); 
} 
while (RunTraceQueryWorker) 

Thread.Sleep(200); 
DoneTraces.Set(); 

} 

private void StartGettingTraceData() 
{ 
    RunTraceQueryWorker = true; 
    new Thread(GetTraceData).Start(); 
} 

private bool StopGettingTraceData() 
{ 
    RunTraceQueryWorker = false; 
    bool timedOut = !DoneTraces.WaitOne(10000); 
    return timedOut; 
} 

这是不可能知道具体是为什么你的代码冻结不理解什么ReadData & ProcessIncomingTrace()做。

+0

你说得对。当我注释掉这两行代码时,情况正常。我必须有其他问题。 – 2013-05-09 14:58:12

+0

如果你在ReadData()调用中放置一个断点,你有没有看到它返回? – Chris 2013-05-09 15:03:29

+0

我决定使用与你非常相似的代码(while while循环)。解决我的问题,我不得不使用'ProcessIncomingTrace()'函数。现在就像魅力一样。 – 2013-05-09 19:48:28

0

那么,很有可能ReadData呼叫被阻止。顺便说一句,你用所有这些递归线程让自己变得很难......你不能只用一个循环吗?

private void GetTraceData() 
{ 
    byte[] receivedbytes = new byte[1]; 

    while(RunTraceQueryWorker) 
    { 
     if(Connection.ReadData(receivedbytes) && receivedbytes[0] == 192) 
     { 
      ProcessIncomingTrace(); 
     } 
     Sleep(100); 
    } 

    Thread.Sleep(200); 
    DoneTraces.Set(); 
}