Внедрение Inter Thread Communication в Qt

У меня проблема с реализацией следующего сценария. Моя постановка проблемы выглядит так:

  1. У меня есть 3 темы. ThreadCamera для захвата кадров с камеры. ThreadProcess для обработки (выполнение некоторой обработки изображений с помощью OpenCV для изображения / захваченного кадра) кадра и основного потока GUI для отображения изображения.
  2. Я не знаю, сколько времени потребуется ThreadProcess для обработки изображения. Поэтому я хочу передать изображение из ThreadCamera в ThreadProcess, выполнить некоторую обработку изображения и передать его в основной поток GUI для отображения.
  3. Когда ThreadProcess обрабатывает изображение, ThreadCamera должна спать. То есть он не должен захватывать дальнейшие кадры с камеры. Когда ThreadProcess завершает задачу обработки изображения, он должен передать изображение и некоторую информацию в основной поток GUI. После этого должна проснуться только ThreadCamera и получить следующий кадр / изображение с запуска камеры в этом потоке (ThreadCamera).

Спасибо, ребята … после некоторых комментариев, чтобы поставить работу камеры и обработки изображений в один поток, я хотел бы знать еще один момент … который …

  1. Что делать, если я не хочу спать с камерой во время обработки? Для меня не имеет значения, потеряю ли я некоторые кадры, захваченные CameraThread (что в любом случае я теряю, если я сплю или не сплю с камерой)

Я использую QObject для каждого процесса («Процесс камеры» и «Обработка изображений») и команду movetoThread, чтобы запустить его в определенном потоке.

Любое понимание о реализации и дизайне сигналов / слотов будет полезно.

2

Решение

То, что вы ищете, это простой шаблон «Публикация / подписка». В этом типе шаблона «рассылки» все сообщения отправляются и просто отбрасываются клиентом, когда он не в состоянии получать изображения

Я бы реализовал это как следующее в вашем приложении:

Есть все отдельные темы (Camera, Processing, Gui), как вы уже делаете.

Сделайте так, чтобы CameraThread перидокально (через сигнал qTimer, может быть, если вы хотите упростить его) захватил изображение и отправил его через соединение сигнал / слот в processingThread.

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

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

Хитрость в создании этой работы заключается в том, чтобы включить это вызов функции (QCoreApplication::processEvents()) в главном цикле ProcessingThreads в функции обработки. Это позволит вашему ProcessingThread обрабатывать любые сигналы, которые он получает, пока он делает что-то полезное.

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

2

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

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

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