【问题标题】:How can I create a second UI thread in Delphi with its own message processing loop?如何在 Delphi 中使用自己的消息处理循环创建第二个 UI 线程?
【发布时间】:2013-01-28 05:50:48
【问题描述】:

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

【问题讨论】:

  • WinForms 表示 .Net。您是真的在 Delphi 项目中使用 .Net,还是只是在 Windows 上使用 Delphi 表单?
  • 谢谢我的意思是 VCL 表单,但我确实通过 COM 互操作在我的 Delphi 项目中使用了一些 .NET 控件:)。
  • 你可以通过使用 Fibers 在一个线程中工作(参见msdn.microsoft.com/en-us/library/windows/desktop/…)。如果您的脚本代码阻塞任何东西,它将不起作用,但如果您只想单步执行和可视化,它会起作用。基本上,您需要将脚本断点转换为切换当前光纤。我已经使用它向使用 COM 库的图像处理代码添加了可视化单步。
  • @mghie 我认为世界上没有人曾经设法使用光纤编写过健壮的程序。甚至 MS 都无法为 SQL 服务器管理它。
  • @David:我能说什么,这些程序对我和客户来说都足够强大。完成这项任务并不难,只需两根光纤和非常明确的切换点......

标签: multithreading delphi vcl


【解决方案1】:

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

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

【讨论】:

  • 有一个进程内方式。这可以通过为其他“VCL 线程”使用 DLL 来实现。 DLL 必须包含它自己的 RTL 和 VCL。这样 DLL 的 RTL/VCL 就不会知道 EXE 的 RTL/VCL。如果您想要超过 2 个线程,则需要另一个 DLL,您不能将一个 DLL 两次加载到内存中(无需编写自己的 DLL 加载器)
  • @AndreasHausladen 获取另一个 DLL 的简单方法是复制到不同的文件名,这会强制加载程序以不同的方式处理它。
【解决方案2】:

Delphi 表单只是单线程的。 TControl 的任何后代,包括 TForm,只能从主 UI 线程访问。切勿在除主线程之外的任何对象上调用任何 TApplication 方法。

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

【讨论】:

  • 谢谢 Rob,是否有可能让 VCL 表单在不同的线程中与 COM 一起使用?我可以退出进程,或者只是将我的所有脚本访问同步到 UI 并让它在后台线程中运行,但希望有一个更简单的解决方案。
  • 没有。正如我所说,VCL 类只在主 UI 线程上工作。 COM 与它无关。
猜你喜欢
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
相关资源
最近更新 更多