В простом приложении MFC мне нужен рабочий поток, который постоянно опрашивает ioctl на событие. Сначала я попытался добиться этого с помощью неперекрывающегося ioctl внутри цикла while. Я понял, что если ioctl не завершит io-запрос немедленно, поток передаст управление или переключение контекста в другой поток (основной поток или цикл управления сообщениями MFC), но вместо этого заблокирует приложение.
Во второй попытке я использую перекрытие, и проблема исчезла. Но мне кажется, что эти два метода идентичны по поведению, так как я использую WaitForSingleObject, который ожидает срабатывания события (запрос завершен).
Основная схема следующая. Обратите внимание, что следующий код не является полным и там показать только конструкцию
Синхронный:
WaitForIo {
do {
DeviceIoControl(hDevice,ioctl_code, ..., NULL);
do something after io request completed
} while(1);
return;
}
Асинхронный:
WaitForIo {
do {
Overlapped ov;
//CreateEvent
DeviceIoControl(hDevice,ioctl_code, ..., &ov);
WaitForSingleObject
do something after io request completed
} while(1);
}
почему два метода ведут себя по-разному? Что-то не так в моей логике?