我正在使用结构化灯光,我写了QCamera
和QProjector
个类。当投影机投射图案时,它必须等待所有连接的相机捕获该图案,然后再移动到下一个图案。
我目前的模特是:
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
哲学的方法吗?
答案 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()))