小编Eri*_*oek的帖子

线程消息循环在Delphi中挂起

我有一个简单的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;
Run Code Online (Sandbox Code Playgroud)

要设置控制器,我这样做:

Controller := TController.Create(true); // Create suspended
Controller.FreeOnTerminate := True;
Controller.Resume;
Run Code Online (Sandbox Code Playgroud)

为了处理主表单的消息,我尝试使用两个Application.Run和以下循环(紧接在后面Controller.Resume)

while not Application.Terminated do begin
  Application.ProcessMessages;
end;
Run Code Online (Sandbox Code Playgroud)

我已经被困在这里 - 任何帮助将不胜感激.

delphi multithreading messages message-queue tthread

5
推荐指数
1
解决办法
2798
查看次数