Я работаю со структурированным светом, и у меня есть QCamera
а также QProjector
классы, которые я написал. Когда проектор проецирует шаблон, он должен подождать, пока все подключенные камеры захватят этот шаблон, прежде чем перейти к следующему.
Моя текущая модель такова:
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
философия?
Вы можете инициализировать переменную-член в вашем QProjector
с receivers(SIGNAL(hold()))
и каждый раз, когда слот вызывается, вы уменьшаете его. Когда счетчик достигает 0
переинициализируешь с receivers(SIGNAL(hold()))
и проецирует другой шаблон.
Конечно, в этом сценарии hold()
это ужасное (несемантическое) имя, вы должны переименовать его в patternRead()
или что-то типа того.
Вы можете предоставить объект-посредник следующим образом:
//startWork increments some internal counter
connect(camera_1...n, SIGNAL(captureStarted()), mediator, SLOT(startWork()))
//stopWork decrements the counter, when counter reaches 0 emits trigger()
connect(camera_1...n, SIGNAL(captureFinished()), mediator, SLOT(stopWork()))
//startCapture emits captureStarted
connect(projector, SIGNAL(patternProjected()), camera_1...n, SLOT(startCapture())
//projectNext emits patternProjected
connect(mediator, SIGNAL(trigger()), projector, SLOT(projectNext()))