簡體   English   中英

為什么這個線程永遠都不會結束?

[英]Why doesn't this thread ever end?

我正在嘗試控制一台測試設備,並且需要正確確定與之通信的順序。

首先,我調用StartGettingTraceData() 然后在將來的某個時間,我調用StopGettingTraceData()嘗試結束GetTraceData()函數,而不是重新啟動自身。 但是那永遠不會發生。 實際上,我從未到達DoneTraces.Set()所以在bool timedOut = !DoneTraces.WaitOne(10000)timedOut始終為true;

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;
}

您應該使用while循環查看情況,而不是再次調用GetTraceData,如下所示:

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;
}

在不了解ReadDataProcessIncomingTrace()作用的情況下,不可能確切地知道為什么代碼會凍結。

好吧, 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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM