Я думаю, что мне нужно кое-что прояснить, как читать из именованного канала и заставить его немедленно возвращаться, данные или нет. Я вижу, что ReadFile завершается с ошибкой, как и ожидалось, но GetLastError возвращает либо ERROR_IO_PENDING, либо ERROR_PIPE_NOT_CONNECTED, и это происходит до истечения времени ожидания моего окружающего кода. Я получаю эти ошибки ДАЖЕ ЧЕРЕЗ ДАННЫЕ В ФАКТЕ ПРИБЫЛИ. Я знаю это, проверяя мой буфер чтения и видя, что я ожидаю. И труба продолжает работать. Я подозреваю, что не правильно использую перекрывающуюся структуру, я просто устанавливаю все поля на ноль. Мой код выглядит так:
gPipe = CreateFile(gPipename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
pMode = PIPE_READMODE_MESSAGE;
bret = SetNamedPipeHandleState(gPipe, &pMode, NULL, NULL);
OVERLAPPED ol;
memset(&ol, 0, sizeof(OVERLAPPED));
// the following inside a loop that times out after a period
bret = ReadFile(gPipe, &tmostat, sizeof(TMO64STAT), NULL, &ol);
if (bret) break;
err = GetLastError();
// seeing err == ERROR_IO_PENDING or ERROR_PIPE_NOT_CONNECTED
Так что я могу делать то, что хочу, игнорируя ошибки и проверяя поступившие данные, но меня это беспокоит. Есть идеи, почему у меня такое поведение?