确定,我正在编写一个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的调用,然后亲自查看。

10-08 04:46