У меня проблема с реализацией следующего сценария. Моя постановка проблемы выглядит так:
Спасибо, ребята … после некоторых комментариев, чтобы поставить работу камеры и обработки изображений в один поток, я хотел бы знать еще один момент … который …
Я использую QObject для каждого процесса («Процесс камеры» и «Обработка изображений») и команду movetoThread, чтобы запустить его в определенном потоке.
Любое понимание о реализации и дизайне сигналов / слотов будет полезно.
То, что вы ищете, это простой шаблон «Публикация / подписка». В этом типе шаблона «рассылки» все сообщения отправляются и просто отбрасываются клиентом, когда он не в состоянии получать изображения
Я бы реализовал это как следующее в вашем приложении:
Есть все отдельные темы (Camera, Processing, Gui), как вы уже делаете.
Сделайте так, чтобы CameraThread перидокально (через сигнал qTimer, может быть, если вы хотите упростить его) захватил изображение и отправил его через соединение сигнал / слот в processingThread.
Когда processingThread обрабатывает изображение, он устанавливает флаг состояния (может быть просто переменной-членом, сработал бы bool), чтобы сказать, что в данный момент он обрабатывает изображение. Когда вы закончите обработку изображения, вы устанавливаете флаг, чтобы сказать, что вы не обрабатываете.
В слоте processingThreads, который получает изображения от CameraThread, вы сначала проверите, чтобы увидеть, обрабатываете ли вы в настоящее время изображение. Если да, вы ничего не делаете с данными сигналов и просто возвращаетесь. Если вы не обрабатываете изображение, вы сохраните данные сигналов и вызовете функцию обработки.
Хитрость в создании этой работы заключается в том, чтобы включить это вызов функции (QCoreApplication::processEvents()
) в главном цикле ProcessingThreads в функции обработки. Это позволит вашему ProcessingThread обрабатывать любые сигналы, которые он получает, пока он делает что-то полезное.
Проверка переменной состояния позволит вам «отбрасывать» все новые изображения, отправленные вам, пока вы обрабатываете текущее, и не ставить их в очередь.
Других решений пока нет …