gpt4 book ai didi

delphi - 我不应该从线程中显示表单或消息框吗?

转载 作者:行者123 更新时间:2023-12-03 15:50:40 26 4
gpt4 key购买 nike

我一直在主线程中显示此类内容,并使用事件将窗口的结束与线程同步,以使其知道窗口何时关闭。

今天,在开发过程中,我想将显示的表单从线程移动到主UI,但它成功显示了。我唯一添加的是在主线程中我正在推送等待事件的消息:

procedure WaitWithMessageLoop();
var
vWaitForEventHandles:array[0..1] of THandle;
vWaitForResponse:DWORD;
Msg: TMSG;
begin
vWaitForEventHandles[0] := LServiceMonitor.Handle;
while (1=1) do
begin
vWaitForResponse := MsgWaitForMultipleObjects(1, vWaitForEventHandles, FALSE, INFINITE, QS_ALLINPUT);
if (vWaitForResponse = WAIT_OBJECT_0 + 1) then
begin
while (PeekMessage(msg,0,0,0,PM_REMOVE)) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end
else
if (vWaitForResponse = WAIT_FAILED)
then RaiseLastOSError
else break;
end;
end;

所以我的问题是。这样的场景可以接受吗?或者我应该移动一个表单以在主线程中显示吗?

谢谢

最佳答案

您无法在主 GUI 线程之外可靠地运行 VCL 表单。当您尝试执行此操作时,它可能看起来有效,但在将来的某个时候,此类代码将会失败。最有可能在您最重要的客户端计算机上,以特别关键的方式!

VCL 的设计使得所有 VCL 表单仅从主 GUI 线程创建和操作。如果您需要调用 VCL 表单,那么您必须使用 TThread.Synchronize 等工具来确保表单是在 GUI 线程上创建的。

关于delphi - 我不应该从线程中显示表单或消息框吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10681516/

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