为什么这个帖子冻结我的应用程序?

net*_*boy 7 delphi multithreading

我确定它与GetMessage调用有关,好像我用'while(not terminated)do;'替换它,应用程序会平静地关闭.是因为GetMessage冻结线程吗?您能否提供有关问题本身的更多信息,并最终提供解决方案.谢谢!

type TListener = class(TThread)
  procedure Execute; override;
  destructor Destroy; override;
end;

var l: TListener;
    msg:TMsg;

procedure TListener.Execute;
begin
  while(not Terminated) do
    while(GetMessage(msg, Cardinal(-1), 0, 0)) do;
end;

destructor TListener.Destroy;
begin
  inherited; // <-- freeze here!
end;

begin
  l:= TListener.Create();
  sleep(1000);
  l.Free;
end.
Run Code Online (Sandbox Code Playgroud)

Rob*_*edy 9

考虑内循环的终止条件.GetMessage阻止消息到达,它只False在处理wm_Quit消息时返回.

调用Free你的线程TThread正在等待另一个线程终止 - TThread.Destroy调用WaitFor.但是你的线程永远不会终止,因为它显然从未收到过wm_Quit消息.

由于您已经在使用消息,因此请不要打扰Terminated.这只会检查是否有人调用Terminate了你的线程对象,但由于这样做并不是通知线程它应该停止运行的方法,所以检查它是没有意义的.(如果Terminate方法是虚拟的,你可以覆盖它并让它wm_Quit向线程发布一条消息,但它不是,所以你不能.)

  • 实际上我昨天刚刚提交了一份有关该问题的QC请求.如果你想要一个虚拟的`TThread.Terminate`,请继续投票给http://qc.embarcadero.com/wc/qcmain.aspx?d=97180 (2认同)