确定,我正在编写一个Zoom组件,并且希望它从辅助线程中的屏幕捕获。
您可以假装我只想在一个空组件中派生TThread。我没有在线程中编写任何代码,因此它只是一个简单的无用线程。我在组件主类中编写了以下代码:Thrd := TCaptureThread.Create(False);
。
然后,我在主类销毁代码中编写了Thrd.Free
。现在,当我关闭整个应用程序时,尽管它破坏了所有内容,但该过程并未完全终止。在Windows中,任务管理器显示线程数为1,但进程仍然存在。如果我在线程创建行中添加注释,一切正常,应用程序快速终止。我要怎么办? :(
提前致谢
最佳答案
当您调用Thrd.Free
时,将运行TThread.Destroy
中的以下代码:
Terminate;
if FCreateSuspended then
Resume;
WaitFor;
因此,在线程上调用
Free
将同步终止线程。我的猜测是对
WaitFor
的调用永远不会返回。也许TCaptureThread.Execute
不检查Terminated
并退出。也许TCaptureThread
在等待主线程,所以等待线程死锁。根据您的问题,除了猜测之外,很难做其他任何事情,但是我想检查您的代码是否在破坏
WaitFor
的过程中超过了Thrd
调用。启用调试DCU,将断点设置为对WaitFor
的调用,然后亲自查看。