2009-07-15 1 views
0

私のアプリケーションは、(wxThreadsを使用して)マルチスレッドアプリケーションです。現時点では、メインスレッドと子ワーカースレッドは、(coutを使用して)さまざまなメッセージをStdoutに出力しています。C++ WxWidgets:複数のスレッド間でstdoutをwxTextCtrlにリダイレクト

私はwxTextCtrlを持つ新しいフレーム/ウィンドウを持っており、すべてのStdOutメッセージをそこにリダイレクトしたいと思います。

 
GuiLogFrame   *logframe; 

logframe = new GuiLogFrame(NULL, wxID_ANY, wxEmptyString); 
logframe->Show(); 

logredirector = new wxStreamToTextRedirector(logframe->get_log_textctrl()); 

これは機能しません。私は最後の行を交換する場合でも、

標準出力はwxTextCtrlは限りREDIRがスコープ内にあるよう...私はそれがスコープ外になる場合でも、それは滞在したいログフレームにリダイレクトされます。

私が望むのは、アプリケーションが実行されている間はwxStreamToTextRedirectorを元の状態に保つことです...新しいスレッドのcoutでも同じwxTextCtrlにリダイレクトされます。

どのような考えですか?

答えて

1

非常に重要なことは、GUI操作はメインスレッドでのみ実行する必要があることです。そうしないと、複数のGUI操作が同時に発生したときにクラッシュまたはロックされます。これはWindowsの下では間​​違いありませんが、すべてのプラットフォームに当てはまると思います。あなたがする必要があるのは、GetEventHandler() - > AddPendingEventを使ってイベントをコントロールにポストすることです。その後、wxはオブジェクトのキューにイベントを追加し、メインスレッドが実行されるとGUI操作を実行できます。

これはあなたの質問に対する正確な答えではないかもしれませんが、関連情報です。

0

私はそれを行う方法の1つを見つけましたが、私はマルチスレッドアプリケーションで試してみませんでした。

newを使用して、コンストラクタ()のwxStreamToTextRedirectorへのポインタを作成できます。 そして、デストラクタでポインタを削除することを忘れないでください。

0

wxStreamToTextRedirectorは、そのストリーム内のテキストコントロールをストリームに関連付け、そのdtorで関連付けを解除するRAIIクラスです。もちろん、ローカル変数として使用する代わりにヒープ上に作成することもできますし、手作業で行うこともできます。つまり、ostr.rdbuf(text)と呼び出し、後で元の値rdbuf()に戻します。

しかし、arolson101が書いたように、複数のスレッドで同じwxTextCtrlを使用できるようにすると、コードに問題が残る可能性があります。単純なリダイレクトはこれに役立ちません。あなた自身のカスタムstreambuf-derivedクラスを書く必要があります。これはテキストを直ちに出力するのを避けますが、メッセージをメインのGUIスレッドにポストして、それを要求します。これは完全ではありません。

関連する問題