car*_*mon 3 delphi multithreading vcl
我正在使用嵌入式脚本的VCL(Delphi Win32)表单应用程序平台,并希望添加调试支持.脚本在主VCL线程中执行 - 脚本执行直接UI操作,并具有一些其他遗留约束,将其保留在UI线程中.
调试器UI需要在自己的线程中运行,因为主UI线程将阻塞脚本断点.它仍然需要在线程安全的调试组件的相同过程中才能工作.
我试图关注Blorgbeard对/sf/answers/875417161/的评论,但我不确定这是否可以用Delphi的VCL.(.NET在将表单传递给Application.Run时创建一个新的ApplicationContext)使用以下Delphi,阻止主UI线程会停止第二个线程上的消息处理(反之亦然).
procedure TDebuggerThread.Execute;
begin
CoInitialize(nil);
FForm := TForm2.Create(nil);
FForm.Show;
Application.Run;
end;
Run Code Online (Sandbox Code Playgroud)
Delphi表单只是单线程.必须只能从主UI线程访问任何后代TControl,包括TForm.TApplication除了主线程之外,永远不要调用任何方法.
您当然可以创建与不同线程绑定的其他窗口.您无法在这些线程中使用VCL UI元素.相反,您将使用它CreateWindow来创建主窗口及其上的任何控件.您将编写一个窗口过程来处理发送到这些窗口的任何消息.您将在父窗口过程而不是子窗口过程中处理控制通知消息.
VCL的一个约束是必须在主线程上执行与GUI控件的所有交互.没有办法规避这一点.
如果要使用VCL在单独的线程中显示调试器GUI,则唯一的选择是使用进程外解决方案.换句话说,在不同的进程中运行调试器,并使用IPC在两个进程之间进行通信.