私は、まさにこのような質問が既に存在して見てきました:Redirect stdout to an edit control (Win32)stdoutを編集コントロール(Win32)にリダイレクトします。マークII
をしかし、与えられた解決策は、{のprintfを行うmy_printf
機能を実装するために、プログラマが必要です。コントロールを編集するためにパイプから読み込む}。私のprintfは外部のライブラリにあるので、私はそれを行うことはできません。
理想的には、私はと思っています:
制御
- リダイレクトアプリのstdoutしかし、エディットコントロールのAPIは、あなたがに文字列を書き込むことができた場合それは私のようなものだと思うだろう:
1 - dup'ing stdout to pipe out記述子
3 - バッファ
4にcriptor - 制御を編集するために、バッファからの書き込みは、しかし、行方不明のステップ2がそこにある:
2 - そのパイプへの書き込みアウトディスクリプタが行われたときの信号を得ます。
どうすればその部分を自動化できますか?ソケット
select
のようなものをここで使用できますか? AppendLogがエディットコントロールに文字列を書き込み#define MYPRINT 1 #define WM_MYMESSAGE (WM_USER+1) INT_PTR CALLBACK Foo::DialogProc( ... case WM_COPYDATA: { PCOPYDATASTRUCT pMyCDS = (PCOPYDATASTRUCT) lParam; LPCSTR szString = (LPCSTR)(pMyCDS->lpData); AppendLog(szString); } break; ... } /* static */ void Foo::MainThread() { // Create worker thread DWORD dwThreadId = 0; m_hRedirectStdoutThread = CreateThread( // default security NULL, // default stack size 0, // routine to execute (LPTHREAD_START_ROUTINE) &CTracesConsole::RedirectStdoutThreadRun, // thread parameter NULL, // immediately run the thread 0, // thread Id &dwThreadId); if (NULL == m_hRedirectStdoutThread) { printf("Error creating stdin thread\n"); return; } // Loop forever MSG msg; while (GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } } /* static */ void Foo::RedirectStdoutThreadRun() { // Redirect stdout to pipe int fds[2]; _pipe(fds, 1024, O_TEXT); _dup2(fds[1], 1); // 1 is stdout char buffer[1024]; for (;;) { // Need to flush the pipe _flushall(); // Read stdout from pipe DWORD dwNumberOfBytesRead = 0; dwNumberOfBytesRead = _read(fds[0], buffer, 1024 - 1); buffer[dwNumberOfBytesRead] = 0; // Send data as a message COPYDATASTRUCT myCDS; myCDS.dwData = MYPRINT; myCDS.cbData = dwNumberOfBytesRead + 1; myCDS.lpData = buffer; PostMessage(g_hWindow, WM_MYMESSAGE, 0, (LPARAM)(LPVOID) &myCDS); } }
:だから
[EDIT]
は、デビッドHeffernanの者のコメントによると、私のようなものを持っているでしょう。
[EDIT]
このコードは正しく動作します。 libcurlからstdoutのトレースをリダイレクトすると、libcurlは動作を停止します:)しかし、それは別の話です...
あなたのアプリに 'stdout'をパイプします。 'stdin'を読み込み、それを編集コントロールに吐き出します。ジョブが完了しました。 –
@David Heffernan - 私の質問のポイントは、どこで 'stdin'を読むべきですか?私のアプリはテキストコントロールに直接書き込む。この書き込みをインターリーブして、外部ライブラリから 'stdout'への別の書き込みを取得します。 'stdin'を読んでエディットコントロールに書き込んでいるワーカースレッドを常に持っていることはどう思いますか? – rturrado
私は作業スレッドでstdinの読み取りを行い、パイプが空のときにブロックさせます。ウィンドウのメッセージを使用してメインスレッドのウィンドウにテキストを送信する必要があるため、ウィンドウのスレッドアフィニティを遵守する必要があります。 –