Заставьте QObject ждать своих слушателей перед выполнением функции

Я работаю со структурированным светом, и у меня есть QCamera а также QProjector классы, которые я написал. Когда проектор проецирует шаблон, он должен подождать, пока все подключенные камеры захватят этот шаблон, прежде чем перейти к следующему.

Моя текущая модель такова:

  • QProjector проецирует изображение и излучает сигнал patternProjected(Pattern*),
  • Связано QCameras получают сигнал и подключаются к проектору hold() сигнал (см. ниже). Затем камеры начинают захватывать изображение асинхронно и излучать frameCaptured(cv::Mat) когда сделано.

Ранее у меня был hold() слот в QProjector, Камера, которая хотела, чтобы проектор ждал, вызовет

connect(projector,SIGNAL(hold()),camera,SLOT(wait()))`

где camera->wait() это фиктивная функция. Затем в projector->disconnectNotify()проектор проверяет, receivers(SIGNAL(hold())) это ноль. Если это так, проектор переходит к следующему шаблону в своей очереди; если нет, то это ждет еще немного.

Этот подход — беспорядок, и он даже не работает — нет никакой гарантии, что проектор не перейдет к следующему шаблону между излучением patternProjected() и получение соединения с камеры.

У любого есть более чистый подход, в идеале еще один в соответствии с QObject философия?

1

Решение

Вы можете инициализировать переменную-член в вашем QProjector с receivers(SIGNAL(hold()))и каждый раз, когда слот вызывается, вы уменьшаете его. Когда счетчик достигает 0переинициализируешь с receivers(SIGNAL(hold())) и проецирует другой шаблон.

Конечно, в этом сценарии hold() это ужасное (несемантическое) имя, вы должны переименовать его в patternRead() или что-то типа того.

1

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

Вы можете предоставить объект-посредник следующим образом:

//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()))
0

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