MFC: отображение вывода процесса асинхронно (одновременно), когда процесс выполняется в текстовой области win32 (приложение mfc) - PullRequest
0 голосов
/ 28 февраля 2012

Я хочу разработать приложение в MFC, которое могло бы запустить длительный процесс консоли и выдать его вывод одновременно в текстовой области приложения 32-битного окна.

Я использовал каналы, но он отображал вывод только послеПроцесс завершен.Я попытался _popen, он работает для консольного приложения, но не совместим с приложением win32.

при поиске в Интернете я нашел множество кода с использованием CLR, но мне нужно как-то в MFC, без использования .Net ..Пожалуйста, помогите.

Заранее СПАСИБО: -)

Вот мой код, который запускает приложение:

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: я использую Visual Studio 2010 на x86 Windows 7Я делаю этот код для интеграции с WinPE, поэтому настоятельно необходимо MFC.

1 Ответ

0 голосов
/ 28 февраля 2012

Кажется, проблема в том, что цикл чтения канала блокирует основной поток пользовательского интерфейса вашего приложения, так что ваш диалог не обновляется до завершения цикла.

Есть некоторые вещи, которые вы можете сделать, чтобы решить эту проблемуно самый простой способ - добавить цикл обработки сообщений в цикл do-while после вызова DisplayToTextArea:

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