c++ - MFC: Muestra la salida de un proceso de forma asincrónica(concurrentemente) mientras el proceso está en ejecución en un área de texto win32(aplicación mfc)
winpe (1)
Quiero desarrollar una aplicación en MFC que podría iniciar un largo proceso de consola y dar su salida al mismo tiempo en un área de texto de la aplicación de Windows de 32 bits.
Utilicé tuberías, pero muestra la salida solo después de que el proceso ha terminado. Intenté _popen, funciona para aplicaciones basadas en consola, pero no es compatible con la aplicación win32.
mientras buscaba en Internet, encontré numerosos códigos usando CLR, pero necesito alguna forma en MFC, sin el uso de .Net ... por favor ayuda.
Gracias por adelantado :-)
Aquí está mi código que inicia la aplicación:
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);
}
PD: Estoy usando Visual Studio 2010 en x86 windows 7. Estoy haciendo que este código se integre con winPE, por lo tanto necesito fuertemente MFC.
El problema parece ser que el ciclo para leer la tubería bloquea el hilo principal de la interfaz de usuario de la aplicación, de modo que su diálogo no se actualice hasta que termine el ciclo.
Hay algunas cosas que puede hacer para resolver este problema, pero la manera más fácil sería agregar un bucle de procesamiento de mensajes a su ciclo do-while después de llamar a DisplayToTextArea:
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg); // send to window proc
}