如何在Delphi中创建第二个UI线程并使用自己的消息处理循环?

car*_*mon 3 delphi multithreading vcl

我正在使用嵌入式脚本的VCL(Delphi Win32)表单应用程序平台,并希望添加调试支持.脚本在主VCL线程中执行 - 脚本执行直接UI操作,并具有一些其他遗留约束,将其保留在UI线程中.

调试器UI需要在自己的线程中运行,因为主UI线程将阻塞脚本断点.它仍然需要在线程安全的调试组件的相同过程中才能工作.

我试图关注Blorgbeard对/sf/answers/875417161/的评论,但我不确定这是否可以用Delphi的VCL.(.NET在将表单传递给Application.Run时创建一个新的ApplicationContext)使用以下Delphi,阻止主UI线程会停止第二个线程上的消息处理(反之亦然).

procedure TDebuggerThread.Execute;
begin
  CoInitialize(nil);

  FForm := TForm2.Create(nil);
  FForm.Show;
  Application.Run;
end;
Run Code Online (Sandbox Code Playgroud)

Rob*_*edy 6

Delphi表单只是单线程.必须只能从主UI线程访问任何后代TControl,包括TForm.TApplication除了主线程之外,永远不要调用任何方法.

您当然可以创建与不同线程绑定的其他窗口.您无法在这些线程中使用VCL UI元素.相反,您将使用它CreateWindow来创建主窗口及其上的任何控件.您将编写一个窗口过程来处理发送到这些窗口的任何消息.您将在父窗口过程而不是子窗口过程中处理控制通知消息.

  • 不,正如我所说,VCL类只适用于主UI线程.COM与它无关. (3认同)

Dav*_*nan 5

VCL的一个约束是必须在主线程上执行与GUI控件的所有交互.没有办法规避这一点.

如果要使用VCL在单独的线程中显示调试器GUI,则唯一的选择是使用进程外解决方案.换句话说,在不同的进程中运行调试器,并使用IPC在两个进程之间进行通信.