Я добавляю поддержку драйвера FTDI к существующей базе кода, которая связывается с последовательными портами и каналами с использованием Overlapped IO и IOCompletionPort. Я хотел бы напрямую взаимодействовать с FTD2xx.dll, а не использовать функцию виртуального com-порта (http://www.ftdichip.com/Support/Documents/ProgramGuides/D2XX_Programmer%27s_Guide%28FT_000071%29.pdf).
Проблема в том, что, насколько я понимаю, FTD2xx.dll эмулирует Overlapped IO, но не совместим с IOCompletionPort. Однако возможно передать событие, которое устанавливается, когда что-либо изменилось во внутреннем состоянии драйверов. Программа, которую я обновляю, имеет очень низкую пропускную способность, но требует безумно низкой задержки (связь в реальном времени со встроенной системой).
Поэтому мой вопрос заключается в том, как я могу ждать, пока событие будет сигнализировано, или IOCompletionPort не будет пустым? Предпочтительно не использовать другие потоки.
Или, альтернативно, я могу использовать RegisterWaitForSingleObject с обратным вызовом, который отправляет сообщение custome в IOCompletionPort? Я понимаю, что это использует пул потоков, может ли это увеличить задержку в случаях, когда система занята? (Я могу установить свой собственный thredas на высокий приоритет, но я ничего не знаю о приоритетах пула потоков).
Изменить: если я использую флаг WT_EXECUTEINWAITTHREAD в RegisterWaitForSingleObject, какой поток является этим "официантом" и какой приоритет он имеет?
IOCP не является ожидаемым объектом, поэтому вы не можете использовать его напрямую с любой функцией ожидания. Что вы можете сделать, так это создать отдельное ожидаемое событие через CreateEvent()
а затем GetQueuedCompletionStatus/Ex()
отдельный вызов потока GetQueuedCompletionStatus/Ex()
и передать событие, когда поступит пакет IOCP.
GetQueuedCompletionStatus()
чтобы определить, когда доступен результат IOCP. И если вы прочитаете фактическую документацию MSDN, IOCP не будет указан в качестве одного из поддерживаемых типов объектов различными функциями ожидания.