2011-08-15 14 views
0

私は高速レンダリングアプリケーションを持っており、ログメッセージを別ウィンドウに出力したいと思います。アプリケーションはマルチスレッド化されており、すべてのスレッドで任意の時点で何かが記録される可能性があります。ウィンドウへのメッセージ、ゲームアプリケーションのログ

私はすでに出力用にコンソールを使用していますが、うまくいきました!私が何をしたか

た:

  • スレッドが言いたいことがあるときはいつでも、それは「フラッシュがあり、キューをロックし、キュー
  • にそのメッセージを挿入LogMessageにキュー
  • を作成します。 "スレッドは、何らかのスレッドが何かを記録するまでスリープします(log()を呼び出すと、スレッドはスリープ状態になります)。そのジョブは、すべてのログメッセージをファイルとコンソールにフラッシュします。

これは、ファイルとコンソールの両方のロギングでうまくいきました。どちらも、印刷呼び出しを受け取っているスレッドがアプリケーションのメインスレッドと異なっていても気にしないようです。しかし、any other window you create does care。今作成したseparate RichText windowに印刷しようとすると、フラッシュスレッドが機能しなくなります。

これは残念です。今度は、のフラッシュスレッドコードをメインスレッド(レンダリングループを実行するのと同じもの)に移動するという唯一の解決策があります。これは、フレームの表示に潜在的に長い遅延があることを意味します(ログキュー彼らは出力することができます)、私はしたくないです。

答えて

0

あなたのフラッシュスレッドの競合どのように見えるかを持っているように思える:

  • それが行うには仕事がありません時に眠ることができるようにしたいと考えてワーカースレッド、だ - そうなのWaitForSingleObjectのを使用してイベントハンドラ

  • しかし、スレッドがウィンドウを作成する場合、GUIスレッドとして動作する必要があります。つまり、ブロックまたは待機することはできず、代わりにメッセージループ(GetMessage/TranslateMessage/DispatchMessage)が完了したときに表示されます。

次のように、この見かけ上の紛争を解決するための1つのアプローチがある:

  • はMsgWaitForMultipleObjectsを使用します。基本的にこのWAITFORのバージョン...イベントが発生した場合に目を覚ますだろう、またはリッチエディットが処理する必要があるメッセージがある場合、GetMessage()などを使用して処理し、終了したらMsgWaitFor ...に戻り、イベントまたはGUIメッセージのいずれかを待って再度開始します。これは、スレッドをGUIスレッドとワーカースレッドの両方にすることができます。

別のアプローチ(おそらくより多くの仕事である、と私は上記のものが多い既存のコードのためのより良いフィット感だと思う - しかし、とにかくこれを言及する)は、次のとおりです。

  • の代わりになりますワーカースレッドはWaitForSingleObjectを使用してスリープ状態になり、GUIスレッドであるという事実を利用します。 GetMessage()を呼び出すことによって事実上スリープ状態になり、別のスレッドがメッセージをポストするとスリープ状態になります。これには、スレッドが所有しているメッセージを投稿できる隠しウィンドウが必要です。 (PostThreadMessageを使用して隠れたウィンドウを作成する必要がなくなるかもしれませんが、スレッドがメッセージボックスやダイアログを表示した場合に隠れたウィンドウが最も安全な場合にメッセージが「消失する」と思われるいくつかのトリッキーな問題がありますアプローチ)。
関連する問題