2

WinForms/GTK#/WPF/MonoMac/etc に依存せずに独自のウィンドウを作成する必要があるクロスプラットフォーム ライブラリを想像してみてください (これは、興味がある場合はOpenTKです)。

Windows および X11 対応の Unice は、各スレッドに 1 つずつ、複数のイベント ループをサポート (または使用できます) します。つまり、(a) スレッドごとに 1 つのウィンドウを作成し、それらを独立して動作させることができ、(b) あるスレッドで WinForms (または GTK#、WPF など) ウィンドウを実行し、別のスレッドで OpenTK ウィンドウを開くことができます。干渉なし。

さて、私の知る限りでは - 確かに限られた - 知る限り、Carbon はこれをサポートしていません。OS イベントは「メイン」イベント ループにのみ配信され、すべてのセカンダリ スレッドはヒュームで実行されます (つまり、ReceiveNextEvent は常に eventLoopTimedOutErr を返し、イベントを検出しません)。OpenTK 自体はこの制限で問題なく動作しますが、OpenTK と別のツールキット (MonoMac など) を組み合わせて構成ウィンドウを表示しようとするアプリケーションには、興味深い問題が生じます。

2 つのオプション:

  • アイデアを狂ったものとして放棄し、OpenTK をさまざまなツールキットと混在させることを禁止します (悪い)。
  • バトルアックスを選び、カーボンをハックして服従させます (良い)。

これがあなたが入ってきたところです:これを機能させる方法を考えられますか? 次のシナリオを想像してください。

  1. スレッド #1 (メイン) は、独自に選択した初期化コードを実行し、2 番目のスレッドを生成します (これは自由に変更できます)。
  2. スレッド #1 (メイン) はネイティブ ウィンドウを開き、RAEL ループ (RunApplicationEventLoop) を実行します。必要に応じてタイマーをインストールしてコードを実行することはできますが、直接制御することはできません。
  3. スレッド #2 (セカンダリ) は、すぐにハングする OpenTK ウィンドウを開きます (イベントはスレッド #1 にのみ配信され、ReceiveNextEvent は何も取得しません)。

スレッド #1 からのイベントをフィルタリングし、必要に応じてスレッド #2 に配信することは可能ですか? ここで CF が何らかの形で役立つ可能性はありますか? Mac OS X の達人、助けてください!

(プログラミング言語は問題ではありません。使い慣れたものを使用してください。Carbon ベースのソリューションが望ましいですが、Cocoa でも問題なく動作します。)

4

2 に答える 2

1

あるスレッドから別のスレッドにイベントを渡すことは、イベントを単純に配信する限り機能するはずです。厄介な部分は、コアのCarbon Event処理がスレッドセーフであっても、UI関連のAPIの多くがスレッドセーフではないことです。コントロールの更新と描画を伴うものはすべて、おそらくメインスレッドで処理する必要があります。それには多くのやりとりが必要であり、それを機能させることを試みる価値はないかもしれません。

于 2011-10-31T20:29:09.940 に答える
0

Application.AddMessageFilterIMessageFilterインターフェイスを見てください。カスタム ロジックを使用して、メッセージを傍受して転送できる場合があります。私は過去にこの手法を使用したことがありますが (非常に遠い過去)、非常に昔のことなので、それに伴うすべての注意事項を覚えているわけではありません。メッセージ フィルタがすべてのメッセージを受信するかどうかさえ定かではありません。.NET は、それらを に送信する前にバックグラウンドでフィルター処理していない可能性がありますが、試してみるIMessageFilter価値はあります。

于 2010-11-03T18:57:56.043 に答える