2014-03-05 45 views
0

我們有一個用C++編寫的巨大而複雜的wxWidgets應用程序。我添加了一個額外的後臺線程。當用戶點擊「開始」時,線程開始。當他們點擊「停止」時,線程停止。對於我無法理解的原因,點擊「停止」 會導致顯示以下信息:無法終止線程(錯誤6)

Can not wait for thread termination (error 6: the handle is invalid.) 
Couldn't terminate thread (error 6: the handle is invalid.) 

究竟爲什麼會出現這種情況?更重要的是,我該如何立即消失?

的線程在這裏開始:

_worker = new WorkerThread(); 
_worker->Create(); 
_worker->Run(); 

我知道一個事實,即線程運行,因爲我可以看到它的寫入磁盤文件。

線被停在這裏:

if (_worker) 
{ 
    _worker->Delete(); 
    _worker = NULL; 
} 

WorkerThread類只覆蓋Enter()。這是絕對一個可拆卸的線程。

該文檔充滿了關於可拆卸線程如何隨時刪除自身的嚴重警告,並且所有內容都必須始終封裝在關鍵部分。但我的工作線程永遠運行,直到我告訴它停止。我看不出爲什麼我需要一個關鍵部分。

線程花費的時間太長而無法停止?是的問題? (它每秒只檢查一次TestDestroy()一次,是不是太慢了?)

我真的搞不明白地獄怎麼解決這個問題。

回答

0

可能使用wxLogNull「使其消失」,與wxWidgets生成的任何其他消息一樣。你應該而不是這樣做,但是因爲你的代碼中似乎有一個真正的bug,線程句柄顯然不應該是無效的,如果是的話,顯然不會像你想象的那樣去執行。通過清除地毯下的錯誤,您可以保證在最糟糕的時刻它會以不同的方式重新出現,並且通常在您無法調試的客戶端計算機上。最好現在就做。

+0

我基本上同意這封郵件中的所有內容。 – MathematicalOrchid