Почему мое приложение для HID-устройств с горячим подключением работает все медленнее с каждым подключением?

Я использую собственный код 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;
}

Являются ли эти два дескриптора единственными ресурсами, которые вы выделили при подключении?

Ben Voigt 29.05.2019 03:13

Ну, есть скрытые возможности и перекрытия, но я не думаю, что им нужно что-то особенное.

karamazovbros 29.05.2019 07:52

@BenVoigt Если при выполнении ReadFile возникает ошибка, достаточно ли просто закрыть дескриптор?

karamazovbros 30.05.2019 02:24

Обычно да (по крайней мере, с другими классами USB-устройств, которые я использую). Проверяйте наличие ошибок в вызове CloseHandle(), даже если вы ничего не можете с этим поделать, потому что знать, когда возникает проблема, — это полдела.

Ben Voigt 30.05.2019 06:42

@BenVoigt Я проверил, и обе функции CloseHandle работают успешно.

karamazovbros 31.05.2019 01:16

@BenVoigt Я могу повторно подключиться к своему устройству в среде, отличной от Qt, без замедления работы графического интерфейса. Та же DLL, так что, может быть, у нее есть что-то с QLibrary, которую я использую для загрузки моей DLL?

karamazovbros 01.06.2019 01:07

Используете ли вы систему обработки событий Qt для обработки данных с устройства? Вы подписываете слушателей несколько раз?

Ben Voigt 01.06.2019 05:54

Вся обработка выполняется в моей пользовательской DLL с использованием библиотек Windows и установки соединения с «CreateFile» для моего IOHandle. Когда происходит отключение, я запускаю функцию подключения, чтобы снова искать дескриптор устройства (поскольку возможно, что дескриптор мог измениться после отключения), или другое устройство может подключиться. Я снова успешно нахожу дескриптор устройства, успешно отправляю свои начальные сообщения, и для всех целей соединение с устройством снова устанавливается, за исключением замедления графического интерфейса.

karamazovbros 01.06.2019 06:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема была связана с Qt. Настройка подключения QTimer, связанная с функцией ReadReport, вызывалась несколько раз, что приводило к замедлению при последующих попытках подключения.

Другие вопросы по теме