2015-11-16 1 views
0

Я работаю в модуле для моего приложения, чтобы читать его с устройства считывания штрих-кода HID.CancelIO последний раз за минуту при удалении HID-устройства

Это приложение Windows (протестировано в Windows 10), и я использую Visual C++.

Чтобы прочитать, я получаю путь к устройству и звоню ReadFile с FILE_FLAG_OVERLAPPED, а затем используйте WaitForMultipleObjects, чтобы дождаться лекции. Если я хочу закрыть приложение или пользователь выбирает другое устройство, я запускаю второе событие для отмены и звонящего CancelIO.

До сих пор так хорошо ... все работает отлично.

Теперь я хочу определить, удаляет ли пользователь выбранное HID-устройство ... Я зарегистрирую окно и поймаю событие DeviceChange. Также работайте хорошо .... но когда я отменяю чтение курса и звоню CancelIO, эта функция занимает более минуты, чтобы вернуться. Я старался не звонить CancelIO в этом случае (удаление устройства) и может удалить устройство и подключить его снова, и он работает ... но когда я закрываю приложение, то для потока требуется более минуты (поток в заряд чтения) до конца. Поэтому я предполагаю, что приложение пытается отменить чтение устройства.

Так что мой вопрос: что делать, когда я обнаруживаю устройство, которое я читаю, удаляется ???

Заранее спасибо.

ответ

1
  1. Вы заметили, что CancelIo только отменяет IO, выпущенные из же нити?
  2. Вы уверены, что не отменяете уже выполненную операцию?
  3. Просьба измерить, что именно занимает много времени во время выключения. Вероятно, это будет CloseHandle.
  4. Просьба сделать простое приложение, которое демонстрирует проблему. В идеале у него будет только main() и есть MessageBox(), где вам нужно удалить устройство.
+0

Hi Codeguard. Спасибо за ваши комментарии ... 1) Это тот же самый поток, что и call CancelIO. Поток останавливается в ожидании чтения ... тогда, когда устройство отключается, поток пользовательского интерфейса уведомляет об этом потоке, который запускает событие отмены, разблокируя поток чтения и вызывая CancelIO. Возможно, CancelIO не требуется в этом сценарии (не мог найти никакой информации об этом), но затем, когда поток завершен (Join), он длится более 1 минуты. Если я назову CancelIO, эта минута теряется в CancelIO, а не при завершении темы. –

+0

2) Как я уже сказал, возможно, никакой CancelIO не требуется, когда пользователь удаляет устройство. Но блокировка происходит тогда, когда заканчивается нить. Даже если я снова добавлю это устройство и работаю с ним. –

+0

3) При шуминге долгое время теряется в Join. Это не мой код. –