2011-06-23 36 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。