gpt4 book ai didi

multithreading - 为什么这个线程会在销毁时卡住我的应用程序?

转载 作者:行者123 更新时间:2023-12-03 14:52:31 27 4
gpt4 key购买 nike

我确信它与 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com