4

我正在开发一个带有嵌入式脚本的 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;
4

2 回答 2

6

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

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

于 2013-02-12T20:08:53.007 回答
5

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

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

于 2013-02-12T20:08:25.523 回答