gpt4 book ai didi

delphi - 线程内的消息循环

转载 作者:行者123 更新时间:2023-12-03 14:38:23 35 4
gpt4 key购买 nike

如何使用 OTL 在线程内实现消息循环?应用程序.ProcessMessages;是我到目前为止所使用的,但使用起来不太安全。

谢谢

最佳答案

这是我从线程队列中提取消息的方法:

while GetMessage(Msg, 0, 0, 0) and not Terminated do begin
Try
TranslateMessage(Msg);
DispatchMessage(Msg);
Except
Application.HandleException(Self);
End;
end;

使用Application.ProcessMessages将从调用线程的队列中提取消息。但它不适合在消息循环中使用,因为它不会阻塞。这就是您使用 GetMessage 的原因。如果队列为空,它会阻塞。并且 Application.ProcessMessages 还会调用其他未设计为线程安全的 TApplication 方法。因此,有很多理由不从主线程以外的线程调用它。

当你需要终止线程时,我会这样做:

Terminate;
PostThreadMessage(ThreadID, WM_NULL, 0, 0);
//wake the thread so that it can notice that it has terminated

这些都不是 OTL 特定的。此代码全部旨在存在于 TThread 后代中。然而,这些想法是可以转移的。

<小时/>

在注释中,您表明您想要运行一个繁忙的、非阻塞的消息循环。为此,您可以使用 PeekMessage

while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin
Try
TranslateMessage(Msg);
DispatchMessage(Msg);
Except
Application.HandleException(Self);
End;
end;

关于delphi - 线程内的消息循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13931782/

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