Я использую порты завершения ввода / вывода в Windows для связи через последовательный порт (потенциально у нас будет много и много использования последовательного порта). Я сделал все как обычно, создав IOCP, раскрутив потоки ввода / вывода и связав мой дескриптор CreateFile()
с IOCP (CreateFile()
был вызван с FILE_FLAG_OVERLAPPED
). Это все работает нормально. Я установил COMMTIMEOUTS
all на 0, кроме ReadIntervalTimeout
, который установлен на MAXDWORD
, чтобы быть полностью асинхронным.
В моей ветке ввода / вывода я заметил, что GetQueuedCompletionStatus()
блокируется бесконечно. Я использую INFINITE
тайм-аут. Поэтому я ставлю вызов ReadFile()
сразу после того, как связываю свой дескриптор с IOCP. Теперь это приводит к немедленному освобождению GetQueuedCompletionStatus()
по какой-то причине с передачей 0 байт, но ошибок нет (возвращает true, GetLastError () сообщает 0). Я, очевидно, хочу, чтобы он блокировался, если ему нечего делать. Если я добавлю еще один ReadFile()
после GetQueuedCompletionStatus (), то другой поток в пуле подберет его с 0 переданными байтами и без ошибок.
В примерах, которые я видел и использовал, я не вижу, чтобы кто-либо устанавливал hEvent
для структуры OVERLAPPED
при использовании IOCP. Это необходимо? Я не хочу блокировать потоки IOCP - поэтому я никогда не буду интересоваться CreateEvent(...) | 1
.
Если это не нужно, что может быть причиной проблемы? GetQueuedCompletionStatus()
необходимо заблокировать, пока данные не поступят на последовательный порт.
Есть ли хорошие примеры последовательных портов IOCP? Я не нашел полный пример последовательного порта + IOCP там. Большинство из них для розеток. Теоретически он должен работать для последовательных портов, файлов, сокетов и т. Д.