我有一個圖形應用程序正在從相機中提取數據。攝像機事件循環運行在對象中啓動的線程中,我使用對象的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會下降,但我會嘗試它...請給我一些想法。