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

时间:2011-08-05 17:18:17

标签: multithreading delphi

我确定它与GetMessage调用有关,好像我用'while(not terminated)do;'替换它,app会平静地关闭。是因为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.

1 个答案:

答案 0 :(得分:9)

考虑内循环的终止条件。 GetMessage会阻止消息到达,并且只有在处理False消息时才会返回wm_Quit

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

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