Запись и чтение произвожу в разных потоках. Работаю с USB-девайсом через драйвер собранный в DriverStudio. Запись в потоке как в синхр., так и в асинхр. режимах работает нормально, чтение же в потоке работает только в синхронном режиме, в асинхронном ничего не принимает - WaitForSingleObject возвращает WAIT_TIMEOUT. В основном же потоке однократное чтение в асинхр режиме работает без проблем.
| Код | UINT ReceiveThread( LPVOID pParam ) { stop_r = 0; while(stop_r == 0) { RealRead = 0;
//Синхр. режим. Нормально работает //ReadFile(PipeIn, &buf_r, 60, &RealRead, NULL);
//Асинхронный режим bool bReadDone = false;
while(!bReadDone) { DWORD success = ReadFile(PipeIn, &buf_r, 60, &RealRead, &gOverLapped_Read); //обработаем результат ReadFile if(success == 0) { DWORD dwError = GetLastError(); if(dwError == ERROR_IO_PENDING) { DWORD dwWait = WaitForSingleObject(hEvent_Read,100); switch(dwWait) { case WAIT_OBJECT_0: if(!GetOverlappedResult(PipeIn,&gOverLapped_Read,&RealRead, FALSE)) { Sleep(1); } else { bReadDone = true; } break; case WAIT_TIMEOUT: break; } } } else { bReadDone = true; } }
RD_spd += RealRead; RealRead=0; ... }//while(stop_r == 0) return 0; AfxEndThread(0, TRUE); }
|
Хендлы для асинхронного режима созданы правильно:
| Код | PipeOut = CreateFile(devNameOut, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, //NULL NULL); //проверка результата if (PipeOut != INVALID_HANDLE_VALUE) init = 1; else init = 0;
PipeIn = CreateFile(devNameIn, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, //NULL NULL); //проверка результата if (PipeIn != INVALID_HANDLE_VALUE) init = 1; else init = 0; //}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
hEvent_Write = CreateEvent( NULL, // default security attribute TRUE, // manual-reset event TRUE, // initial state = signaled NULL); // unnamed event object
// set up overlapped structure fields gOverLapped_Write.Offset = 0; gOverLapped_Write.OffsetHigh = 0; gOverLapped_Write.hEvent = hEvent_Write;
hEvent_Read = CreateEvent( NULL, // default security attribute TRUE, // manual-reset event TRUE, // initial state = signaled NULL); // unnamed event object
// set up overlapped structure fields gOverLapped_Read.Offset = 0; gOverLapped_Read.OffsetHigh = 0; gOverLapped_Read.hEvent = hEvent_Read; }
|
Почему я не могу принять данные в потоке в асинхр режиме? Поток создаю так AfxBeginThread(ReceiveThread, pNewObject); |