C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Блокируется PeakNamedPipe
klen
Отправлено: 05.12.2005, 19:20


Машинист паровоза

Группа: Участник
Сообщений: 239



Функция потока наследника TThread

CODE

void __fastcall TConsoleIOStatusThread::Execute()
{
SetName();
//ожидание завершение процесса
WaitForSingleObject( FProcessHandle, INFINITE );
DWORD TotalBytesAvail;
do
{

PeekNamedPipe( FReadHandle , NULL , 0, NULL , &TotalBytesAvail, NULL );
Sleep(250);

}while(TotalBytesAvail);

// закрытие канала
CloseHandle (FWriteHandle);
CloseHandle (FReadHandle);

}


Проблема в том что если в цикл вставить Sleep, или вообще в любое место после вызова PeekNamedPipe то следующий вызов этой функции намертво блокируется системой. Объясните корреляцию.. на ноуте все работает без проблем. На настольной машине только если Sleep убрать.

Я уже встречалс с блокировкой системных вызовов которые не должны блокироватся — так и не разобрался от куда ноги растут.

Отредактировано klen — 05/12/2005, 19:21
klen
Отправлено: 07.12.2005, 11:21


Машинист паровоза

Группа: Участник
Сообщений: 239



Задача решена для частного случая. к сожалению. — все завалено в один поток.
Оказалось что PeekNamedPipe без проблем работает в контексте потока в котором создавался канал. А вот если ее вызывать в другом потоке то ее работа зависит от ниизвестро чего — какимто образом код этой другой нити влияет на результат.

Вернуться в Вопросы программирования в C++Builder