线程中的奇怪问题,应用程序不会退出

时间:2011-07-09 18:25:24

标签: delphi delphi-xe

好的我正在编写一个Zoom组件,我希望它能够在辅助线程中从屏幕捕获。 您可以假装我只想在空组件中派生TThread。我没有在线程中写任何代码,所以它只是一个简单的无用线程。我在组件主类中编写了这段代码:Thrd := TCaptureThread.Create(False);。 然后我在主类破坏代码中写了Thrd.Free。现在,当我关闭整个应用程序时,尽管它会破坏所有内容,但该过程并未完全终止。在Windows任务管理器中显示线程数为1但该过程仍然存在。如果我评论线程创建行,一切都会变好,应用程序会很快终止。我该怎么办呢? :(

提前致谢

3 个答案:

答案 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;

我一直在这种方式使用线程一段时间,我从来没有遇到过问题。