Нужно ли устанавливать hEvent в структуре OVERLAPPED при выполнении портов завершения ввода / вывода? - PullRequest
1 голос
/ 02 июня 2011

Я использую порты завершения ввода / вывода в 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 там. Большинство из них для розеток. Теоретически он должен работать для последовательных портов, файлов, сокетов и т. Д.

1 Ответ

0 голосов
/ 03 июня 2011

Я понял это - я не звонил SetCommMask() с EV_RXCHAR | EV_TXEMPTY, а затем WaitCommEvent() со структурой OVERLAPPED.После того, как я это сделал, мои потоки IOCP вели себя как ожидалось.GetQueuedCompletionStatus() возвращается, когда в порту появляется новый символ.Затем я мог бы позвонить ReadFile().

Поэтому, чтобы ответить на оригинальный вопрос: «Нет, вам не нужно устанавливать hEvent для IOCP с последовательными портами.»

...