我不应该从不显示线程中的窗体或消息框吗?



我一直在主线程中显示这些东西,并使用事件将窗口的末尾与线程同步,以使其知道窗口何时关闭。

今天,在开发过程中,我想将显示的窗体从线程移动到主 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 线程上创建表单。

最新更新