Создаю pipe, запускаю программу - итог висяк. Как проверить что pipe не нужно читать - виснет на чтение pipe. Можно ли перед чтением узнать, в pipe есть информация, или pipe пустой?
Cоздаю процесс
STARTUPINFOA si = {sizeof(si),0};
PROCESS_INFORMATION pi = {0,};
OVERLAPPED ov = {0,};
SECURITY_ATTRIBUTES sa = { sizeof(sa), 0 };
sa.bInheritHandle = 1;
char usr[4]; // Данные
HANDLE waits[2]; // Список ожидающих хандлов
HANDLE pIn;
HANDLE pOut;
CreatePipe(&pOut,&si.hStdOutput,&sa,1);
CreatePipe(&si.hStdInput,&pIn,&sa,1024);
ov.hEvent = CreateEventA(0,1,0,0);
si.hStdError = si.hStdOutput;
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW ;
si.wShowWindow = SW_HIDE;
waits[0] = pOut;
int anti = 1000;
bool working = true;
bool read = true;
int i=0;
CreateProcessA(0,// какая нибудь консольная
"c:\\windows\\Microsoft.NET\\Framework\\v2.0.50727\\MSBuild.exe"
,0,0,1,0,"\0\0\0\0",".",&si,&pi);
waits[1] = pi.hProcess;
Теперь опрос
while (working) {
dw = -1;
if (GetExitCodeThread(pi.hThread,&dw))
if (dw != 259) break; // Подобрано
switch (WaitForMultipleObjects(2,waits,0,100)){
case 0:
if (read) {
ReadFile(pOut,usr,1,&dw,&ov); // Тут виснет
if ((dw == 0) &&(GetLastError() == ERROR_IO_PENDING ))
read = false;
} else {
dw = 0;
GetOverlappedResult(pOut,&ov,&dw,0);
if (dw != 0 )
read = true;
}
}
Думал асинхронное чтение спасёт ситуацию - но нет - не работает. Само чтение работает хорошо - получаю все байты, которое отправило консольное приложение в консоль. Но вот "конец посылки" определить не получается.
Microsoft ms-example
Виртуальный выделенный сервер (VDS) становится отличным выбором
Сразу скажу, с С++ знаком около 2-х месяцев
Задача сделать так, чтобы программа работала в двух потокахНужно искусственно усыплять поток, дабы эмулировать долгие вычисления
Хочу записать в com-порт и прочитать из него некоторое количество байтС записью проблем вроде бы нет, write ошибок не возвращает