3

私は常にメインスレッドでそのようなものを表示し、イベントを使用してウィンドウの終わりをスレッドと同期させ、ウィンドウが閉じられたことを知らせてきました。

今日、開発中に表示フォームをスレッドからメイン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;

だから私の質問はです。そのようなシーンは受け入れられますか?または、フォームを移動してメインスレッドに表示する必要がありますか?

ありがとう

4

1 に答える 1

5

メインGUIスレッドの外部でVCLフォームを確実に実行することはできません。これを行おうとすると、機能しているように見えるかもしれませんが、将来のある時点で、そのようなコードは失敗します。最も重要なクライアントマシンで、特に重要な方法で発生する可能性があります。

VCLは、すべてのVCLフォームがメインGUIスレッドからのみ作成および操作されるように設計されています。VCLフォームを呼び出す必要がある場合はTThread.Synchronize、フォームがGUIスレッドで作成されていることを確認するなどのツールを使用する必要があります。

于 2012-05-21T08:42:27.597 に答える