在执行函数之前让QObject等待其侦听器

时间:2013-02-20 19:10:14

标签: c++ qt signals-slots qobject

我正在使用结构化灯光,我写了QCameraQProjector个类。当投影机投射图案时,它必须等待所有连接的相机捕获该图案,然后再移动到下一个图案。

我目前的模特是:

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

之前我在hold()中有QProjector个广告位。想让投影机等待它的相机会打电话给

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

其中camera->wait()是一个虚函数。然后,在projector->disconnectNotify()中,投影机会检查receivers(SIGNAL(hold()))是否为零。如果是,则投影仪移动到其队列中的下一个模式;如果没有,它会等待更多。

这种方法很乱,甚至无法工作 - 无法保证投影机不会在发射patternProjected()和从相机接收连接之间转移到下一个模式。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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()))