Я работаю со структурированным светом, и у меня есть QCamera
и QProjector
классы, которые я написал. Когда проектор проецирует шаблон, он должен дождаться, пока все подключенные камеры не уберут этот шаблон до того, как он перейдет к следующему.Сделать QObject ждать своих слушателей перед выполнением функции
Моя текущая модель такова:
QProjector
проектирует изображение и излучает сигналpatternProjected(Pattern*)
.- Подключено
QCamera
s получает сигнал и подключается к сигналуhold()
проектора (см. Ниже). Затем камеры начинают фиксировать изображение асинхронно и испускаютframeCaptured(cv::Mat)
по завершении.
Раньше у меня был hold()
слот в QProjector
. Камера, кто хотел проектор, чтобы ждать, пока она будет называть
connect(projector,SIGNAL(hold()),camera,SLOT(wait()))`
где camera->wait()
является фиктивной функцией. Затем, в projector->disconnectNotify()
, проектор проверяет, равен ли receivers(SIGNAL(hold()))
. Если это так, проектор переходит к следующему шаблону в своей очереди; если он не ждет еще.
Этот подход является жарким беспорядком, и он даже не работает - нет гарантии, что проектор не перейдет к следующему шаблону между испусканием patternProjected()
и получением соединения с камерой.
У кого-нибудь есть более чистый подход, в идеале еще один в соответствии с философией QObject
?
Спасибо, что был действительно толчок в правильном направлении. Теперь у меня есть сигнал 'aboutToAdvance()' в проекторе, который подключается к слову 'projectorAboutToAdvance()'. Когда этот слот вызывается, камера испускает 'allowProjectorToAdvance (bool allow)' с истинным или ложным в зависимости от того, разрешить или не разрешить шаблон. Это собирает 'permissionToAdvance (bool allow)', который уменьшает счетчик 'ожиданияFor' и увеличивает счетчик' deniedAdvance', если 'allow' является ложным. Если 'waitingFor' равно нулю, а' deniedAdvance' отличным от нуля, продвижение не допускается. –