前幾天經各位大神幫助,知道了用管道來進行控制臺程式的通信。 我測驗后,發現了新的問題:我的程式(主程式)創建管道,創建一個子行程,如果我創建的子行程是一個win32控制臺程式的話(該程式會不斷的輸出資訊),那么我讀取管道中的資料會很慢,ReadFile會阻塞好長時間才能回傳,但是如果我創建 的子行程是一個cmd常用命令(比如ping 192.168.1.1 -t ),那么ReadFile卻不會阻塞,很及時回傳資訊。這是怎么回事? 怎么能對win32控制臺程式的讀取也及時些呢?
SECURITY_ATTRIBUTES sa;
HANDLE hRead, hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead, &hWrite, &sa, 0))
{
AfxMessageBox("Error On CreatePipe()");
return;
}
STARTUPINFO si={0};
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if(!CreateProcess(NULL, "start.bat", NULL //這里創建的子行程在bat檔案里
,NULL, TRUE, 0, NULL, NULL, &si, &pi))
{
AfxMessageBox("Error on CreateProcess()");
return;
}
CloseHandle(hWrite);
char buffer[1025] = {0};
DWORD bytesRead;
while(((CPipeDlg*)(t))->isend==FALSE)
{
//取出管道資料
if(ReadFile(hRead, buffer, 1024, &bytesRead, NULL) == NULL){ //對win32控制臺程式讀取,這里會阻塞好長時間
break;
}
// do something with data.
buffer[bytesRead] = 0; // null terminate
((CPipeDlg*)(t))->EditAppend(buffer);
Sleep(200);
}
uj5u.com熱心網友回復:
1024 改 256 行不行?uj5u.com熱心網友回復:
不行。等待的時間沒什么變化。
uj5u.com熱心網友回復:
百度搜相關關鍵字。Pipe Functions
The following functions are used with pipes.
CallNamedPipe
ConnectNamedPipe
CreateNamedPipe
CreatePipe
DisconnectNamedPipe
GetNamedPipeHandleState
GetNamedPipeInfo
PeekNamedPipe
SetNamedPipeHandleState
TransactNamedPipe
WaitNamedPipe
uj5u.com熱心網友回復:
經過測驗,發現用createpipe創建管道指定大小值時不管用,win32控制臺程式的輸出有一個固定的緩沖區大小,約4K位元組,只有這個緩沖區填充滿了后,ReadFile才能讀到資料,在此之前,ReadFile會一直阻塞。 那么有沒有辦法能設定這個win32控制臺程式的輸出緩沖區大小呢? 是否是從系統層面來進行設定?uj5u.com熱心網友回復:
發送端 必要時 使用 fflush( stdout );uj5u.com熱心網友回復:
win32-console-hook-lib轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/95355.html
標籤:基礎類
