複数のスレッドからログメッセージを収集し、それらをすべてウィンドウを使用して表示するのに最適な方法は何ですか? (スレッドが実行されている間)。C++ WxWidgets:複数のスレッドからのメッセージの単一ログウィンドウ
私は現在、stdout(cout)をwxTextCtrlにリダイレクトしようとしていますが、複数のスレッドでそうしようとすると悲惨に失敗します。どんな助けもありがとう。
複数のスレッドからログメッセージを収集し、それらをすべてウィンドウを使用して表示するのに最適な方法は何ですか? (スレッドが実行されている間)。C++ WxWidgets:複数のスレッドからのメッセージの単一ログウィンドウ
私は現在、stdout(cout)をwxTextCtrlにリダイレクトしようとしていますが、複数のスレッドでそうしようとすると悲惨に失敗します。どんな助けもありがとう。
最近、wxWidgetsトランクにいくつかの主要なアップデートがありました。それらについては、hereについて読むことができます。それらの1つは、メインスレッド以外のスレッドからのログ記録のサポートを追加することです。
どのように失敗していますか?私はwxTextCtrlに精通していませんが、それが大きな問題になる可能性のある同期(つまりスレッドセーフです)を組み込んでいない限り、このような単一のリソースを保護する最も簡単な方法は、名前付き 'mutex'を使用する方法です。次の例は、一度に1つだけがこのリソース(出力ウィンドウ)にアクセスすることを確認するために各スレッドで行うことができます。
// In each thread's initialization:
HANDLE mutexHandle = CreateMutex(0,FALSE,"__my_protecting_mutex__");
// Whenever you use the debug output:
WaitForSingleObject(mutexHandle, /* Timeout if you like. */ 0xFFFFFFFF);
// Do our printing here.
ReleaseMutex(mutexHandle);
// In each thread's cleanup:
CloseHandle(mutexHandle);
これは、基本的に、待機と解放の間に1つのスレッドしか存在しないことを保証します。あなたの問題が実際にwxTextCtrlにルーティングされている場合、私はいくつかの詳細を必要とします。
編集:私が投稿した内容はWindows固有で、おそらくあなたは窓にはないことに気付きました!あなたがいない場合、私は他のプラットフォームの同期メソッドの経験はありませんが、boostにはプラットフォーム固有ではないいくつかの汎用ライブラリがあります。
wxWidgetsには、クロスプラットフォームwxMutexクラスが組み込まれています http://docs.wxwidgets.org/stable/wx_wxmutex.html – GRB
同期はその一部にすぎません。別のスレッドから直接wxTextCtrlに書き込むことはお勧めできません。スレッドセーフ(同期化)されたデータ構造にログメッセージを追加し、メインのGUIスレッドがキューからテキストコントロールへのログを取るようにしてくださいデータ。 wxWidgetsトランクにはこれがあります。他の答えを見てください。 – mghie