Delphi 从阻塞的管道读取文件
在下面的代码中,我使用“commandLine”参数创建了另一个进程,但是这个子进程可能没有将sth写入管道,因此readfile函数将被阻塞。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
如果没有数据,如何让它返回
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)