我正在开发一个带有嵌入式脚本的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;
答案 0 :(得分:6)
Delphi表单只是单线程。必须只能从主UI线程访问TControl
的任何后代,包括TForm
。除了主线程之外,不要在任何事情上调用任何TApplication
方法。
当然,您可以创建绑定到不同线程的其他窗口。您无法在这些线程中使用VCL UI元素。相反,您将使用CreateWindow
创建主窗口及其上的任何控件。您将编写一个窗口过程来处理发送到这些窗口的任何消息。您将在父窗口过程而不是孩子的窗口过程中处理控制通知消息。
答案 1 :(得分:5)
VCL的一个限制是必须在主线程上执行与GUI控件的所有交互。没有办法规避这一点。
如果要在单独的线程中使用VCL显示调试器GUI,则唯一的选择是使用进程外解决方案。换句话说,在不同的进程中运行调试器,并使用IPC在两个进程之间进行通信。