【发布时间】: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