Я использую собственный код Windows для перечисления списка HID-устройств и настройки соединения на основе идентификаторов оборудования. Я делаю это в DLL, которую использую в приложении Qt. У меня нет проблем с подключением, записью и чтением данных. Когда я выключаю устройство, я хочу, чтобы мое приложение автоматически повторно подключалось к устройству или другому устройству с теми же идентификаторами оборудования; однако при каждом последующем подключении графический интерфейс Qt замедляется. Например, переключение между вкладками заметно задерживается.
Это заставило меня поверить, что, возможно, я неправильно отключаюсь от HID-устройства или есть какая-то утечка памяти. Если я перезапускаю приложение, снова подключаюсь к устройству, тогда графический интерфейс работает нормально.
В настоящее время при чтении отчета в случае сбоя я запускаю процесс «отключения», закрывая дескрипторы, но, может быть, этого недостаточно? Есть ли способ в некотором смысле «очистить планшет», чтобы я снова подключался к устройству без замедления передачи данных?
Вот мой код, в котором я закрываю дескриптор ввода-вывода и дескриптор события:
char* HID::ReadReport()
{
DWORD BytesRead;
InputReportBuffer[0] = REPORT_ID;
BOOL Result = ReadFile(IOHandle, InputReportBuffer, Capabilities.InputReportByteLength, &BytesRead, (LPOVERLAPPED)&HIDOverlapped);
if (Result)
{
}
else
{
}
return InputReportBuffer;
}
Ну, есть скрытые возможности и перекрытия, но я не думаю, что им нужно что-то особенное.
@BenVoigt Если при выполнении ReadFile возникает ошибка, достаточно ли просто закрыть дескриптор?
Обычно да (по крайней мере, с другими классами USB-устройств, которые я использую). Проверяйте наличие ошибок в вызове CloseHandle()
, даже если вы ничего не можете с этим поделать, потому что знать, когда возникает проблема, — это полдела.
@BenVoigt Я проверил, и обе функции CloseHandle работают успешно.
@BenVoigt Я могу повторно подключиться к своему устройству в среде, отличной от Qt, без замедления работы графического интерфейса. Та же DLL, так что, может быть, у нее есть что-то с QLibrary, которую я использую для загрузки моей DLL?
Используете ли вы систему обработки событий Qt для обработки данных с устройства? Вы подписываете слушателей несколько раз?
Вся обработка выполняется в моей пользовательской DLL с использованием библиотек Windows и установки соединения с «CreateFile» для моего IOHandle. Когда происходит отключение, я запускаю функцию подключения, чтобы снова искать дескриптор устройства (поскольку возможно, что дескриптор мог измениться после отключения), или другое устройство может подключиться. Я снова успешно нахожу дескриптор устройства, успешно отправляю свои начальные сообщения, и для всех целей соединение с устройством снова устанавливается, за исключением замедления графического интерфейса.
Проблема была связана с Qt. Настройка подключения QTimer, связанная с функцией ReadReport, вызывалась несколько раз, что приводило к замедлению при последующих попытках подключения.
Являются ли эти два дескриптора единственными ресурсами, которые вы выделили при подключении?