我创建了一个匿名管道,也创建了二个线程,
其中的一个线程不停的往管道写数据,另一个线程使用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读不到数据...请问如何解决谢谢

解决方案 »

  1.   

    WaitForSingleObject(pi.hProcess, INFINITE);
    线程同步不正确导致出现"死"的情况.在读的进程:当每次读取完毕后,应该设置该事件为有信号状态.
    ::SetEvent(HANDLE);
      

  2.   

    BOOL ReadFile(
      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