我正在开发一个简单的 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;
我被困在这里 - 任何帮助将不胜感激。