Можно ли ждать ForForMultipleObjects для события и IOCompletionPort с вводом?

0

Я добавляю поддержку драйвера 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, какой поток является этим "официантом" и какой приоритет он имеет?

  • 0
    У меня нет никакого опыта в этой области, поэтому я не буду отвечать на этот вопрос, но из документации WaitforSingleObjectEx должно работать, если вы установите для аргумента bAlertable значение true. msdn.microsoft.com/en-us/library/windows/desktop/...
  • 0
    Спасибо за ваш комментарий. Это не будет работать для меня, потому что я получаю не только перекрывающиеся результаты ввода-вывода из ожидающего потока через IOCompletionPort, но также пользовательские сообщения и результаты завершения из других потоков и состояние документов "Функция ожидания возвращается, а процедура завершения вызывается, только если bAlertable ИСТИНА, и вызывающий поток является потоком, который инициировал операцию чтения или записи. "
Показать ещё 3 комментария
Теги:
multithreading
winapi

1 ответ

0
Лучший ответ

IOCP не является ожидаемым объектом, поэтому вы не можете использовать его напрямую с любой функцией ожидания. Что вы можете сделать, так это создать отдельное ожидаемое событие через CreateEvent() а затем GetQueuedCompletionStatus/Ex() отдельный вызов потока GetQueuedCompletionStatus/Ex() и передать событие, когда поступит пакет IOCP.

  • 0
    этот microsoft.public.win32.programmer.networks.narkive.com/dIXQefU9/… предполагает, что это ожидаемое событие, но значение отличается от того, что я хочу.
  • 0
    Эта ссылка НЕ предполагает, что IOCP является ожидаемым объектом, на самом деле он говорит о том же, что и я, - вы должны использовать GetQueuedCompletionStatus() чтобы определить, когда доступен результат IOCP. И если вы прочитаете фактическую документацию MSDN, IOCP не будет указан в качестве одного из поддерживаемых типов объектов различными функциями ожидания.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню