2010-01-13 112 views
1

可能重複:
How to stop long executing threads gracefully?德爾福 - 終止阻塞的線程

你好。

我有一個後臺線程需要執行一個操作,除了在一種情況下它工作的很好:當資源被損壞時。當發生這種情況時,線程在Execute方法中的Load(對該資源)調用中被阻塞。

當發生這種情況時,線程將不會響應Terminate方法(從主線程調用)並被阻塞。

所以,我的問題是:如何正確終止阻塞的線程(從主線程)。不,我不能修改加載資源的類,或者如果資源已經損壞或者不知道。

+1

你在談論什麼類型的資源? – 2010-01-13 15:12:37

+0

類似的問題是[這裏](http://stackoverflow.com/questions/255276/how-to-stop-long-executing-threads-gracefully) – SimaWB 2010-01-13 11:41:43

回答

1

尋找TerminateThread() WinAPI函數。 可以找到一些有用的解釋here或查看MSDN文檔。

當然,在終止之後,您必須查看線程中分配的任何資源是否已釋放,並將其釋放。


更新

是,使用TerminateThread是不好的做法(如在註釋中指定)。我同意這個觀點。但是「從來不使用它,即使你真的需要使用它」,從我的觀點和理論來看,它的建議太強大了。真正的世界充滿了設計缺陷和錯誤的第三方庫。
有關這一具體情況的信息不足以作出正確的決定。例如。它可能是暫時的解決辦法,沒有替代品等
因此,從觀點正確答案的理論觀點是:「有沒有辦法正確地終止進程,如果你無法控制如何‘凍結’一步後臺線程處理「。
從視圖正確答案的實際問題是:「有沒有辦法正確地終止進程,如果你無法控制如何‘凍結’一步後臺線程處理,但是,如果你意識到你不能,但。仍然需要這樣的功能 - 使用TerminateThread()API調用」

關於TerminateThread對比了TerminateProcess:
- 創建/終止過程中需要比創建/終止線程
更多的資源 - 創建/終止工藝比較複雜=>詳細漏洞的位置
- TerminateProcess不會立即終止並等待I/O o perations to complete(MSDN)=>不適用於遠程共享文件夾在閱讀和其他類似I/O場景時不可用的情況。
- 創建和終止過程中需要比創建線程多用戶權限,比較MSDN herehere

關於資源釋放:終止線程時(如在MSDN mentonied)
線程堆棧自動釋放。資源主要是資源,由主線程分配用於與後臺線程進行通信。例如。內存結構,互斥體等。

+0

對,*看看*那個函數,然後得出結論,你應該永遠不要打電話給它。您不能釋放線程分配的資源,因爲您不知道它們是什麼或如何釋放它們。 (例如,你如何釋放線程堆棧?) – 2010-01-14 00:30:45

+1

這個問題*是*相同。無論您是否有權訪問源代碼都無關緊要 - 兩個問題的限制條件都是相同的:代碼無法修改,並且我們無法預先知道線程是否需要停止。此外,對另一個問題的回答也適用於這個問題。最好的辦法是修改程序,以便線程不會首先被阻塞。如果這不可行,則將操作移至單獨的進程。終止整個過程比終止一個線程要安全得多。 – 2010-01-14 00:38:20