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

时间:2013-02-12 20:01:26

标签: multithreading delphi vcl

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

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

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

procedure TDebuggerThread.Execute;
begin
  CoInitialize(nil);

  FForm := TForm2.Create(nil);
  FForm.Show;
  Application.Run;
end;

2 个答案:

答案 0 :(得分:6)

Delphi表单只是单线程。必须只能从主UI线程访问TControl的任何后代,包括TForm。除了主线程之外,不要在任何事情上调用任何TApplication方法。

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

答案 1 :(得分:5)

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

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