作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我确信它与 GetMessage 调用有关,就好像我将其替换为“while(not returned) 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.
最佳答案
考虑内部循环的终止条件。 GetMessage
会阻塞,直到消息到达,并且仅在处理 wm_Quit
消息时返回 False
。
在 TThread
上调用 Free
的线程正在等待另一个线程终止 - TThread.Destroy
调用 WaitFor
。但您的线程永远不会终止,因为它显然从未收到 wm_Quit
消息。
由于您已经在使用消息,因此不必费心检查已终止
。这只检查是否有人在您的线程对象上调用了 Terminate
,但由于这样做显然不是通知线程应该停止运行的方法,因此检查它是没有意义的。 (如果 Terminate
方法是虚拟的,您可以覆盖它并让它向线程发送 wm_Quit
消息,但它不是,所以您不能。)
关于multithreading - 为什么这个线程会在销毁时卡住我的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6960141/
我是一名优秀的程序员,十分优秀!