Дизайн класса в Qt для связи между потоками

Постановка задачи : для отслеживания объекта с помощью камеры и перемещения камеры по азимуту и ​​высоте соответственно.

Процесс : камера получает изображения объекта …. каждый кадр камеры обрабатывается, чтобы найти объект (который должен быть отслежен …), и информация, сгенерированная в каждом кадре, передается механическому устройству (кардан … ) переместить камеру в панорамирование и наклон …

дизайн : основной графический интерфейс пользователя запускается в потоке, а камера и кардан — в 2 других потоках … информация, генерируемая в потоке камеры, передается в поток карданного подвеса, и тот же поток (поток камеры …) отображает отслеживаемое изображение …

ОГРАНИЧЕНИЕ: скорость отображения выше скорости перемещения карданного подвеса…так в каждом кадре …

  1. кадр обрабатывается и отображается (с частотой 10 мс)
  2. сгенерированная информация передается на кардан
  3. Резьба карданного подвеса подвешивается на более длительное время (100 мс), чтобы дать время механическим деталям двигаться и гарантировать, что новое обновление не поступит в карданный подвес до завершения его движения.

Следующая диаграмма показывает схему классов и соединений сигналов и слотов в Qt.

введите описание изображения здесь

пожалуйста, предложите любой лучший способ решить проблему, если это возможно …

ОШИБКАИногда я получаю ошибку …

QObject :: killTimers: таймеры нельзя остановить из другого потока

4

Решение

Для меня вы должны просто избегать вызова таких функций между потоками,
Вот идея, которую я бы сделал для безопасного обмена большим количеством данных.

и у вас должен быть конечный автомат с доступом обоих потоков к общей блокируемой переменной (указатель, который будет использоваться для вашего основного потока, который указывает на пинг или буфер понга + мьютекс для вашей блокировки)

таким образом, вы можете изменить способ использования данных, «дисплей» должен всегда использовать один и тот же указатель.
Он должен получить блокировку при начале чтения и после освобождения.

Камера должна писать в другой буфер
После того как камера записана, поток камеры должен попытаться получить блокировку для мьютекса и, если он ее получит (т. Е. Другой поток не читает другой буфер), то поток камеры должен взять блокировку и изменить буфер, указанный указателем. указатель используется основным потоком)

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

Самый большой риск заключается в том, что вы никогда не сможете получить блокировку из потока камеры, вот решение ->
Чтобы ограничить время блокировки, я советую вам иметь второй буфер в каждом потоке, чтобы время блокировки было сокращено до длительности «memcpy».
Добавьте bool к структуре, это говорит о том, обновила ли ваша камера данные или нет.

Если да, основной поток копирует данные.
(и камера не может менять указатели в течение этого времени), но как только это будет сделано, основной поток также сбросит bool в false.
И пока этот bool не вернется к истине, вам не нужно блокировать, чтобы скопировать данные.
(теперь это обмен без блокировки)
Обратите внимание, что это верно только потому, что чтение bool является атомарным действием.

Я надеюсь, что это помогает

(Извините за мой английский)

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]