我创建了一个匿名管道,也创建了二个线程,
其中的一个线程不停的往管道写数据,另一个线程使用readfile()从管道读数据,但readfile()在经常出现"死"的情况,请问如何解决?写数据的线程如下, 它创建了三个进程,每一个进程需要等待前一个进程结束,因为后一个进程需要读取前一个进程的结果:
for(int i=0; i<100; i++)
{
if ( !CreateProcess(NULL, strCommandLine.GetBuffer(255) ,NULL,NULL,
TRUE,NORMAL_PRIORITY_CLASS,NULL, NULL,&si,&pi) )
{ ... }
WaitForSingleObject(pi.hProcess, INFINITE); if ( !CreateProcess(NULL, strXSLC.GetBuffer(255) ,NULL,NULL,TRUE, NORMAL_PRIORITY_CLASS,NULL, NULL,&si,&pi) )
{ ... }
WaitForSingleObject(pi.hProcess, INFINITE); if ( !CreateProcess(NULL, strInverse.GetBuffer(255) ,NULL,NULL,
TRUE, NORMAL_PRIORITY_CLASS,NULL, NULL,&si,&pi) )
{ ... }
WaitForSingleObject(pi.hProcess, INFINITE);
}
而读进程为:
while(TRUE)
{
if (!ReadFile(x->hRead,lpBuffer,sizeof(lpBuffer),&nBytesRead,NULL) || !ytesRead)
{
if (GetLastError() == ERROR_BROKEN_PIPE)
;//break; // pipe done - normal exit path.
} ...写到窗口
}出现的情况是readfile读不到数据...请问如何解决谢谢
其中的一个线程不停的往管道写数据,另一个线程使用readfile()从管道读数据,但readfile()在经常出现"死"的情况,请问如何解决?写数据的线程如下, 它创建了三个进程,每一个进程需要等待前一个进程结束,因为后一个进程需要读取前一个进程的结果:
for(int i=0; i<100; i++)
{
if ( !CreateProcess(NULL, strCommandLine.GetBuffer(255) ,NULL,NULL,
TRUE,NORMAL_PRIORITY_CLASS,NULL, NULL,&si,&pi) )
{ ... }
WaitForSingleObject(pi.hProcess, INFINITE); if ( !CreateProcess(NULL, strXSLC.GetBuffer(255) ,NULL,NULL,TRUE, NORMAL_PRIORITY_CLASS,NULL, NULL,&si,&pi) )
{ ... }
WaitForSingleObject(pi.hProcess, INFINITE); if ( !CreateProcess(NULL, strInverse.GetBuffer(255) ,NULL,NULL,
TRUE, NORMAL_PRIORITY_CLASS,NULL, NULL,&si,&pi) )
{ ... }
WaitForSingleObject(pi.hProcess, INFINITE);
}
而读进程为:
while(TRUE)
{
if (!ReadFile(x->hRead,lpBuffer,sizeof(lpBuffer),&nBytesRead,NULL) || !ytesRead)
{
if (GetLastError() == ERROR_BROKEN_PIPE)
;//break; // pipe done - normal exit path.
} ...写到窗口
}出现的情况是readfile读不到数据...请问如何解决谢谢
线程同步不正确导致出现"死"的情况.在读的进程:当每次读取完毕后,应该设置该事件为有信号状态.
::SetEvent(HANDLE);
HANDLE hFile, // handle to file
LPVOID lpBuffer, // data buffer
DWORD nNumberOfBytesToRead, // number of bytes to read
LPDWORD lpNumberOfBytesRead, // number of bytes read
LPOVERLAPPED lpOverlapped // overlapped buffer
);
中最后一个参数就是异步读取,参照MSDN