2011-06-23 60 views
2

我在Windows XP上有Delphi應用程序。此應用程序使用100個線程。在某些情況下,我必須用線程堆棧的完全刪除來終止線程。Windows API安全終止線程

我尋找的功能從WinAPI的像terminatethread,但它不是safelly和: Windows Server 2003 and Windows XP/2000: The target thread's initial stack is not freed, causing a resource leak.

+0

我正在尋找一種功能來安全地接管其他人的汽車,讓他們都以有序的方式停下來,不會發生任何車禍......任何人?任何人? Bueller? –

回答

12

有沒有這樣的功能。沒有這樣的功能可能存在。 Windows不可能知道哪些資源將被該線程整理,並且它不知道如何去做。這是你的應用程序的責任。

這聽起來對我來說就像你正在做這個錯誤的方式。你應該以合作的方式終止線程而不使用武力。其他任何事情都必然導致泄漏,並且很可能是其他更嚴重的問題。

+0

Snx快速重播。我有另一種方法來解決我的問題,但它有點困難 – TheHorse

+1

+1,我知道一種方法來安全地結束一個不同的(遠程)進程(注入一個執行ExitProcess的線程使用進程的句柄),但沒有這種安全結束線程的方法。有ExitThread,但終止調用它的線程,因此不會有任何用處。 –

+4

安全終止線程的唯一方法是請求它在準備好時自行終止。 –

1

如果你的應用程序線程全部用Delphi代碼編寫,那麼考慮使用OmniThreadLibrary,並使用它提供的服務,而不是原始的Win32 API或TThread的內置功能,這在最新版本的Delphi中是相當不錯的。

但是,對於信號線程和關閉線程,特別是在不是所有線程都是由Delphi THread對象創建和管理的情況下,大量的設計必須由您來完成,而且您可能必須將幾個Win32原語一起構建一個體面的解決方案。例如,我將使用Win32事件並使用Win32事件句柄以C/C++編寫線程信號。

對於純粹的100%delphi代碼庫,我會簡單地使用任何經過良好測試的,並使用TThread API或OmniThreadLibrary,而不是去原始的Win32 API。