我确定它与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.
答案 0 :(得分:9)
考虑内循环的终止条件。 GetMessage
会阻止消息到达,并且只有在处理False
消息时才会返回wm_Quit
。
在Free
上调用TThread
的线程正在等待另一个线程终止 - TThread.Destroy
调用WaitFor
。但是你的线程永远不会终止,因为它显然从未收到wm_Quit
消息。
由于您已经在使用消息,因此请不要费心检查Terminated
。这只会检查某人是否在您的线程对象上调用Terminate
,但由于这样做并不是通知线程它应该停止运行的方法,因此检查它是没有意义的。 (如果Terminate
方法是虚拟的,你可以覆盖它并让它向线程发布wm_Quit
消息,但事实并非如此,所以你不能。)