好的我正在编写一个Zoom组件,我希望它能够在辅助线程中从屏幕捕获。
您可以假装我只想在空组件中派生TThread。我没有在线程中写任何代码,所以它只是一个简单的无用线程。我在组件主类中编写了这段代码:Thrd := TCaptureThread.Create(False);
。
然后我在主类破坏代码中写了Thrd.Free
。现在,当我关闭整个应用程序时,尽管它会破坏所有内容,但该过程并未完全终止。在Windows任务管理器中显示线程数为1但该过程仍然存在。如果我评论线程创建行,一切都会变好,应用程序会很快终止。我该怎么办呢? :(
提前致谢
答案 0 :(得分:6)
当您致电Thrd.Free
时,会运行TThread.Destroy
中的以下代码:
Terminate;
if FCreateSuspended then
Resume;
WaitFor;
在线程上调用Free
将因此同步终止线程。
我的猜测是对WaitFor
的调用永远不会返回。也许TCaptureThread.Execute
不会检查Terminated
并退出。也许TCaptureThread
在主线程上等待,因此线程上的等待会死锁。
根据您的问题,除了猜测之外做很多其他事情很难,但我想检查您的代码是否在WaitFor
的破坏中超过Thrd
调用。启用调试DCU,在调用WaitFor
时设置一个断点并亲自查看。
答案 1 :(得分:0)
这可能是很多事情......从你的线程的Execute
方法永远不会退出死锁。
首先要尝试诊断的是在Delphi下运行您的应用程序。然后,既然你说应用程序关闭它就会挂起,你关闭应用程序。现在您的应用程序被挂起,您暂停应用程序并检查Thread调试面板。在那里,点击每个线程来检查他们的callstack。这应该可以更好地了解它为什么会挂起,以及确切地挂起哪个线程。
答案 2 :(得分:-2)
以这种方式写你的帖子:
type
TCaptureThread = class(TThread)
private
//
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: False);
end;
implementation
constructor TCaptureThread.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
// Set FreeOnTerminate to True
FreeOnTerminate := True;
end;
procedure TCaptureThread.Execute;
begin
// Write the Execute method here...
// And don't forget to synchronise with the form
end;
end.
在表单中,实例化你的线程
Thrd := TCaptureThread.Create(False);
执行
Thrd.Execute;
终止你的帖子
Thrd.Terminate;
我一直在这种方式使用线程一段时间,我从来没有遇到过问题。