2014-02-19 54 views
1

我有一個圖形應用程序正在從相機中提取數據。攝像機事件循環運行在對象中啓動的線程中,我使用對象的setter/getter來獲取數據並使用它。但有時應用程序崩潰。我沒有使用任何同步機制。從相機拉出異步數據會產生隨機崩潰

我有這樣的方法:

void MyClass::onNewColorSample(ColorNode node, ColorNode::NewSampleReceivedData data) 
{ 
    colorData = data; 
} 

我它註冊爲一個外部庫的回調:

g_cnode.newSampleReceivedEvent().connect(&onNewColorSample); 

該方法是每次新幀從攝像機到達時間被調用。

colorData吸氣是:

ColorNode::NewSampleReceivedData MyClass::getColorData() 
{ 
    return colorData; 
} 

然後我用一個並行線程來運行以下命令:

void* MyClass::runThread(void* na) 
{ 
    g_context.run(); 
} 

在某些時候,我開始線程:

pthread_create(&pthread, NULL, runThread, NULL); 

然後類MyClass正從線程中的相機獲取數據。

庫的運行方法,文件說:

運行DepthSense事件循環。連接的事件處理程序在調用run()的線程中運行。在dsCam.getDepthData()

static ColorNode::NewSampleReceivedData colorFrame; 
depthFrame = dsCam.getDetphData(); 
... 

有時應用程序崩潰:

現在我用myClass從相機中獲取數據,在另一個類我有一個方法,即每1/60秒調用。

我認爲發生這個問題的原因是當這個方法返回並且在複製操作的中間我獲得了新的數據時正在複製數據。

我使用一個線程,因爲外部庫不提供非阻塞機制來獲取數據。它只是提供了一個基於事件的機制。

恐怕如果我使用互斥鎖定/解鎖機制,我的FPS會下降,但我會嘗試它...請給我一些想法。

回答

0

最後我用QMutex解決了這個問題:

//RAII class to unlock after method return (when local var out of scope) 

class AutoMutex { 
public: 
    AutoMutex(QMutex* _mutex) { 
     _mutex->lock(); 
     myMutex = _mutex; 
    } 
    ~AutoMutex() { 
     myMutex->unlock(); 
    } 
private: 
    QMutex* myMutex; 

}; 

然後我就用這個類,傳遞給它一個指向互斥(互斥是我班的成員):

ColorNode::NewSampleReceivedData MyClass::getColorData() 
{ 
    AutoMutex autoMut(&mutex); //mutex get locked 
    return colorData; 
} //when method ends, autoMut is destroyed and mutex get unlocked 

DepthNode::NewSampleReceivedData MyClass::getDetphData() 
{ 
    AutoMutex autoMut(&mutex); 
    return depthData; 
}