2013-02-20 98 views
1

我正在使用结构化光源,并且我有QCameraQProjector我写的类。当投影机投射一个图案时,它必须等待所有连接的相机捕捉该图案,然后才能移动到下一个相机。使QObject在执行函数之前等待其侦听器

我目前的模式是这样的:

  • QProjector项目图像,并发出信号patternProjected(Pattern*)
  • 连接QCamera s接收信号并连接到投影机的hold()信号(见下文)。摄像机然后开始异步捕获图像,并在完成后发出frameCaptured(cv::Mat)

以前我在QProjector有一个hold()插槽。谁曾想投影仪的相机等待它会叫

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

其中camera->wait()是一个虚拟函数。然后,在projector->disconnectNotify()中,投影机检查receivers(SIGNAL(hold()))是否为零。如果是,则投影机会继续进入队列中的下一个模式;如果不是,它会再等一会儿。

这种方法非常混乱,它甚至不起作用 - 无法保证投影机不会移动到发射patternProjected()和从相机接收连接之间的下一个模式。

任何人都有一个更清洁的方法,理想情况下更符合QObject哲学?

回答

1

您可以使用receivers(SIGNAL(hold()))初始化您的QProjector中的成员变量,并且每次调用此插槽时,都会减少它。当计数器达到0时,您将使用receivers(SIGNAL(hold()))重新初始化并投影另一种模式。

当然,在这种情况下hold()是一个可怕的(非语义)名称,您应该将其重命名为patternRead()或类似的名称。

+0

谢谢,这是真正朝着正确的方向轻推。 我现在在投影机中有一个'aboutToAdvance()'信号,它连接到'projectorAboutToAdvance()'插槽。当这个插槽被调用时,根据是否允许模式提前,摄像机发出'allowProjectorToAdvance(bool allow)',其中包含true或false。这是通过一个'permissionToAdvance(bool allow)'来收集的,它会递减'waitingFor'计数器,并且如果'allow'为假则增加'deniedAdvance'计数器。如果“waitingFor”为零且“deniedAdvance”不为零,则不允许进步。 – 2013-02-20 19:40:16

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())) 
相关问题