我有一个简单的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;
我卡在这里了 - 希望得到帮助,非常感谢。
begin
放在与其前面的do
或then
同一行时,会使您的代码更难以阅读。虽然这在C语言中被认为是良好的编码风格,但在Delphi中,我们大多数人更喜欢将其单独放在一行,以便我们可以通过视觉对齐begin
和end
成对出现的位置。 - Mason WheelerTController.Execute
中逐步执行代码时,无论我传递什么hwnd,只要我跨越GetMessage
,它就不会继续通过循环。它不会执行循环后的任何语句,它只是莫名其妙地停止了。更令人困惑的是,我看不到线程本身实际上已经死亡的任何迹象。 - Erik WestenbroekSynchronise()
吗?如果没有消息循环在运行,它可能会失败。另外,你使用的是哪个版本的 Delphi? - Natbegin
是视觉上的噪音。仅凭缩进就足以表明所有必要的信息。将这个噪音藏在行尾,这样就不会影响阅读了。 - Rob Kennedy