Delphi 从阻塞的管道读取文件

Delphi 从阻塞的管道读取文件,delphi,readfile,Delphi,Readfile,在下面的代码中,我使用“commandLine”参数创建了另一个进程,但是这个子进程可能没有将sth写入管道,因此readfile函数将被阻塞。 如果没有数据,如何让它返回 if (CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine), @saSecurity, @saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess)) then sOut

在下面的代码中,我使用“commandLine”参数创建了另一个进程,但是这个子进程可能没有将sth写入管道,因此readfile函数将被阻塞。
如果没有数据,如何让它返回

if (CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine), @saSecurity, @saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess))
  then
    sOutputString := '';
  begin

    repeat

      dRunning := WaitForSingleObject(piProcess.hProcess, 100);
      Application.ProcessMessages();

    until (dRunning <> WAIT_TIMEOUT);

    CloseHandle(piProcess.hProcess);
    CloseHandle(piProcess.hThread);

    repeat
      dRead := 0;

      ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
      // But it is blocked......

    until (dRead < CReadBuffer);

  end;
if(CreateProcess(nil,PChar('cmd.exe/C'+命令行),@saSecurity,@saSecurity,True,普通\u优先级\u类,nil,nil,suiStartup,piProcess))
然后
sOutputString:='';
开始
重复
dRunning:=WaitForSingleObject(piProcess.hProcess,100);
Application.ProcessMessages();
直到(旋转等待超时);
CloseHandle(piProcess.hproces);
CloseHandle(piProcess.hThread);
重复
恐惧:=0;
ReadFile(hRead,pBuffer[0],CReadBuffer,dRead,nil);
//但它被封锁了。。。。。。
直到(恐惧
在读取指定管道之前,可以检查该管道是否包含数据

if PeekNamedPipe(hRead, nil, 0, nil, @dwBytesAvailable, nil) then
begin
   if dwBytesAvailable > 0 then
   begin
      ReadFile(...);
   end;
end;

无论如何,这是错误的方法。即使另一个进程写入管道,您的程序也可能会卡住。管道具有固定大小的缓冲区。如果远程进程填充了该缓冲区,那么它将阻塞,直到管道的另一端(即您的进程)从管道读取数据并为更多数据腾出空间。因此,您需要确保您的进程在等待远程进程终止时不会被阻塞。您需要在数据到达时读取数据,以保持两个进程都响应。是的,您说得很对。首先,第二个重复从句包含在第一个重复从句中。但是因为我不知道如何处理阻塞问题,所以我打算等待子进程终止。这真的是个错误,我现在知道为什么了,谢谢!什么烟斗?您的ReadFile应该立即返回0,因为您没有创建任何管道。也可以
WaitForSingleObject(hReadPipe)