2013-02-20 106 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())) 
相關問題