1

問題があります: 1 つのスレッドが、メイン スレッドからリッスンされるイベントを発生させます。eventHandler のメイン スレッドは、次のようなメッセージ ダイアログを表示します。

 MessageDialog md = new MessageDialog (parent_window, flags, msgtype, btntype, msg);
 md.Run ();
 md.Destroy();

ただし、アプリケーションは md.Run(); でクラッシュします。(gtk.application.invoke() を使用して messageDialog を発生させると、クラッシュは発生しませんが、ダイアログにモダリティもありません。)

4

1 に答える 1

1

GTK オブジェクトは、メイン スレッドからのみ安全にアクセスできます。メイン スレッドからイベントをサブスクライブしても、イベントがメイン スレッドから発生するわけではありません。イベントは、それらを発生させるスレッドで発生します。

必要なことは、Application.Invoke を使用してデリゲートをメイン スレッドのメインループで安全にキューに入れ、そのデリゲートから GUI オブジェクトにアクセスすることです。これはイベント ハンドラーで行うことができます。または、デリゲートを使用してイベントをメイン スレッドにディスパッチすることもできます。これにより、イベント ハンドラーはそうする必要がなくなります。これは、内部 API をどのように定義するかの問題です。

Application.Invoke はデリゲートを非同期的に実行しますが、これはダイアログのモダリティには影響しないことに注意してください。ダイアログのモダリティに影響するのは、フラグ パラメータに DialogFlags.Modal フラグを含めるかどうかです。

于 2012-06-19T06:18:21.080 に答える