2012-02-28 4 views
0

MFCで長時間のコンソールプロセスを開始し、その出力を32ビットWindowsアプリケーションのテキスト領域。MFC:プロセスがWin32テキストエリア(mfcアプリケーション)で実行中に非同期(同時)に出力を表示

パイプを使用しましたが、プロセスが終了した後にのみ出力が表示されます。 私は_popenを試しました。これはコンソールベースのアプリケーションでは動作しますが、win32アプリケーションとは互換性がありません。

インターネットを検索しているときにCLRを使用して多数のコードが見つかりましたが、.NETの使用なしでMFCで何らかの方法が必要です。

void CAppMgr_BackupsDlg::ExecuteExternalFile(CString csExeName, CString csArguments) 
{ 

CString csExecute; 
csExecute=csExeName + " " + csArguments; 

SECURITY_ATTRIBUTES secattr; 
ZeroMemory(&secattr,sizeof(secattr)); 
secattr.nLength = sizeof(secattr); 
secattr.bInheritHandle = TRUE; 

HANDLE rPipe, wPipe; 

//Create pipes to write and read data 
CreatePipe(&rPipe,&wPipe,&secattr,0); 

STARTUPINFO sInfo; 
ZeroMemory(&sInfo,sizeof(sInfo)); 
PROCESS_INFORMATION pInfo; 
ZeroMemory(&pInfo,sizeof(pInfo)); 
sInfo.cb=sizeof(sInfo); 
sInfo.dwFlags=STARTF_USESTDHANDLES; 
sInfo.hStdInput=NULL; 
sInfo.hStdOutput=wPipe; 
sInfo.hStdError=wPipe; 
char command[1024]; 
strcpy(command, csExecute.GetBuffer(csExecute.GetLength())); 

//Create the process here. 
CreateProcess(0, command,0,0,TRUE, 
     NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW,0,0,&sInfo,&pInfo); 
CloseHandle(wPipe); 

//now read the output pipe here. 
char buf[100]; 
DWORD reDword; 
CString m_csOutput,csTemp; 
BOOL res; 
do 
{ 
    res=::ReadFile(rPipe,buf,100,&reDword,0); 
    csTemp=buf; 
    m_csOutput=csTemp.Left(reDword); 
      DisplayToTextArea(m_csOutput); 
} 
while(res); 
} 

PS:私はこのコードを統合するために作っています、私は、x86のWindows上のVisual Studio 2010を使用しています7.ここ

は、アプリケーションを起動する私のコードです:-)事前に

THANKSしたがって、winPEではMFCが強く必要です。

答えて

0

問題は、ループを終了するまでダイアログが更新されないように、パイプを読み取るループがアプリケーションのUIメインスレッドをブロックしているようです。

あなたはこの問題を解決することが、最も簡単な方法は、DisplayToTextAreaを呼び出した後、あなたがdo-whileループにメッセージ処理ループを追加することです行うことができますいくつかのものがあります:返信用

MSG msg; 
while (GetMessage(&msg, NULL, 0, 0)) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); // send to window proc 
} 
+0

おかげで!私は上記のコードを使用しました。再度プロセスの出力は終了後に表示されます。同時出力を取得する必要があります。 – Konark

+0

私は、worker_threadが適切なapporachであることをkids_foxに同意します。しかし、私はメッセージ処理ループがそのトリックを作るべきだと思います。たぶんあなたはGetMessageの代わりにPeekMessage(&msg、NULL、0、0、PM_REMOVE)を使うべきです...長いことでした。しかし、それは他の問題かもしれません...あなたは確かにパイプがチャンクでデータを取得していますか? –

+0

返信用の@JavierDePedroに感謝しますが、rpipeを読むために別のワーカースレッドを使用しました。ウィンドウメッセージとハンドラを使用しましたが、出力は同じです。バックグラウンド・プロセスが終了したときにのみ出力が表示されます。 PLZヘルプ。 – Konark

関連する問題