私が取り組んでいる単純なDelphiプログラムがあります。このプログラムでは、スレッドを使用してプログラムの機能をGUIから分離し、より長いタスクなどでGUIの応答性を維持しようとしています。 「コントローラー」TThread、および「ビュー」TForm。ビューは、を介してコントローラーメッセージを送信するために使用するコントローラーのハンドルを認識していますPostThreadMessage
。これまで、この種のモデルをメインフォームではないフォームに使用しても問題はありませんでしたが、何らかの理由で、このモデルをメインフォームに使用しようとすると、スレッドのメッセージループが終了します。
スレッドメッセージループのコードは次のとおりです。
procedure TController.Execute;
var
Msg : TMsg;
begin
while not Terminated do begin
if (Integer(GetMessage(Msg, hwnd(0), 0, 0)) = -1) then begin
Synchronize(Terminate);
end;
TranslateMessage(Msg);
DispatchMessage(Msg);
case Msg.message of
// ...call different methods based on message
end;
end;
end;
コントローラを設定するには、次のようにします。
Controller := TController.Create(true); // Create suspended
Controller.FreeOnTerminate := True;
Controller.Resume;
メインフォームのメッセージを処理するために、次のループと次のループの両方を使用してみApplication.Run
ました(直後Controller.Resume
)
while not Application.Terminated do begin
Application.ProcessMessages;
end;
私はここで立ち往生しています-どんな助けでも大歓迎です。