MFC: Display output of a process asynchronously(concurrently) while process is in execution in a win32 text area (mfc application)

。_饼干妹妹 提交于 2019-12-08 04:34:31

问题


I want to develop an application in MFC which could start a lengthy console process and give its output concurrently on a text area of 32bit windows application.

I used pipes, but it display the output only after the process has terminated. I tried _popen, it works for console based application, but not compatible with win32 application.

while searching internet, I found numerous code using CLR, but I need some way in MFC, without use of .Net.. Plz help.

THANKS in Advance :-)

Here's my code that start the application:

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: I am using Visual studio 2010 on x86 windows 7. I am making this code to be integrated with winPE, therefore strongly need MFC.


回答1:


The problem seems the loop to read the pipe is blocking the UI main thread of your application so that your dialog is not updated until the loop finished.

There are some things you can do to solve this problem but the easiest way would be to add a message processing loop to your do-while loop after calling DisplayToTextArea:

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


来源:https://stackoverflow.com/questions/9480030/mfc-display-output-of-a-process-asynchronouslyconcurrently-while-process-is-i

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!