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