我在Windows XP上有Delphi应用程序。这个应用程序使用100个线程。在某些情况下,我必须使用线程堆栈的完全删除来终止线程。
我在寻找WinAPI中的函数,如Terminatthread,但它不安全:Windows Server 2003 and Windows XP/2000: The target thread's initial stack is not freed, causing a resource leak.
我在Windows XP上有Delphi应用程序。这个应用程序使用100个线程。在某些情况下,我必须使用线程堆栈的完全删除来终止线程。
我在寻找WinAPI中的函数,如Terminatthread,但它不安全:Windows Server 2003 and Windows XP/2000: The target thread's initial stack is not freed, causing a resource leak.
2条答案
按热度按时间kiayqfof1#
没有这样的功能。这样的功能不可能存在。Windows不可能知道该线程将清理哪些资源,也不知道如何进行清理。这就是你的应用程序的责任。
在我看来,你做这件事的方式不对。你应该在不使用武力的情况下,以合作的方式终止线程。其他任何事情都必然会导致泄漏,最有可能的是其他更严重的问题。
n1bvdmb62#
如果您的应用程序线程都是用Delphi代码编写的,那么可以考虑使用OmniThreadLibrary,并使用它提供的服务,而不是原始的Win32API或TThread的内置功能,这在Delphi的最新版本中相当不错。
然而,对于发信号通知线程并关闭它们,特别是在并非所有线程都是由Delphi线程对象创建和管理的情况下,您必须完成大量设计工作,并且您可能必须将几个Win32原语组合在一起才能构建一个像样的解决方案。例如,我将使用Win32事件和使用Win32事件句柄的C/C++编写的线程信号。
对于纯100%的Delphi代码库,我会简单地使用任何经过良好测试的代码,并使用TThreadAPI或OmniThreadLibrary,而不是使用原始的Win32API。