2013-10-05 47 views
0

使用管道從生成的進程讀取時,是否可以在請求輸入時終止所述程序?請求輸入時終止管道程序

如果不終止,平時的ReadFile的循環,直到管道關閉將永遠阻止:

tsi.cb := SizeOf(TStartupInfo); 
tsi.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; 
tsi.hStdInput := hInputRead; 
tsi.hStdOutput := hOutputWrite; 
tsi.hStdError := hErrorWrite; 

if not CreateProcess(nil, PAnsiChar(Cmd), @sa, @sa, true, 0, nil, PAnsiChar(WorkDir), tsi, tpi) then 
    exit; 

// Close handles we don't need. We are only interested in its output 
CloseHandle(hOutputWrite); 
CloseHandle(hInputRead); 
CloseHandle(hErrorWrite); 

repeat 
    // ReadFile will never return while our programs waits for input 
    if not ReadFile(OutputRead, Buf, SizeOf(Buf), nRead, nil) or (nRead = 0) then 
    begin 
     if GetLastError = ERROR_BROKEN_PIPE then 
      Break 
     else 
      ErrFunc('Pipe read error, could not execute file'); 
    end; 

    // do something with buf... 

until False; 

終止本身是很容易(只使用了TerminateProcess),但一個只知道什麼時候調用TerminateProcess當它太晚時,即掛起時。

回答

0

首先,你不使用在Win32意義上的管道,你使用重定向控制檯輸出。
這就是說,但是,如果等待超時,您可以wait on the file handle並中止。