2013-02-20 3 views
1

Я работаю со структурированным светом, и у меня есть 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?

ответ

1

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

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

+0

Спасибо, что был действительно толчок в правильном направлении. Теперь у меня есть сигнал 'aboutToAdvance()' в проекторе, который подключается к слову 'projectorAboutToAdvance()'. Когда этот слот вызывается, камера испускает 'allowProjectorToAdvance (bool allow)' с истинным или ложным в зависимости от того, разрешить или не разрешить шаблон. Это собирает 'permissionToAdvance (bool allow)', который уменьшает счетчик 'ожиданияFor' и увеличивает счетчик' deniedAdvance', если 'allow' является ложным. Если 'waitingFor' равно нулю, а' deniedAdvance' отличным от нуля, продвижение не допускается. –

0

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

//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())) 
Смежные вопросы