4

スクリプトが埋め込まれた VCL (Delphi Win32) フォーム アプリケーション プラットフォームに取り組んでおり、デバッグ サポートを追加したいと考えています。スクリプトはメインの VCL スレッドで実行されます。スクリプトは UI 操作を直接実行し、UI スレッドでそれを保持するその他の従来の制約があります。

メイン UI スレッドはスクリプト ブレークポイントでブロックされるため、デバッガー UI は独自のスレッドで実行する必要があります。スレッド セーフなデバッグ コンポーネントが機能するには、同じプロセス内にある必要があります。

https://stackoverflow.com/a/12505959/243144に関する Blorgbeard のコメントに従おうとしましたが、これが Delphi の VCL でも可能かどうかはわかりません。(.NET は、フォームを Application.Run に渡すときに新しい ApplicationContext を作成します)次の Delphi では、メイン UI スレッドをブロックすると、2 番目のスレッドでのメッセージ処理が停止します(逆も同様)。

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 の制約の 1 つは、GUI コントロールとのすべての対話をメイン スレッドで実行する必要があることです。それを回避する方法はありません。

VCL を使用して別のスレッドでデバッガー GUI を表示する場合、唯一のオプションはアウトプロセス ソリューションを使用することです。つまり、デバッガーを別のプロセスで実行し、IPC を使用して 2 つのプロセス間で通信します。

于 2013-02-12T20:08:25.523 に答える