我有一个从相机中提取数据的图形应用程序。相机事件循环在一个在对象中启动的线程中运行,我使用该对象的setter / getter来获取数据并使用它。但有时应用程序崩溃。我没有使用任何同步机制。
我有这个方法:
void MyClass::onNewColorSample(ColorNode node, ColorNode::NewSampleReceivedData data)
{
colorData = data;
}
我将其注册为外部库的回调:
g_cnode.newSampleReceivedEvent().connect(&onNewColorSample);
每次从相机到达新帧时都会调用该方法。
colorData
的吸气者是:
ColorNode::NewSampleReceivedData MyClass::getColorData()
{
return colorData;
}
然后我使用pthread运行以下内容:
void* MyClass::runThread(void* na)
{
g_context.run();
}
在某些时候我开始了这个帖子:
pthread_create(&pthread, NULL, runThread, NULL);
然后类MyClass
从线程中的摄像机获取数据。
库的run方法文档说:
运行DepthSense
事件循环。连接的事件处理程序在名为run()
的线程中运行。
现在我使用myClass
从相机中获取数据,在我每隔1/60秒调用一个方法的另一个类中:
static ColorNode::NewSampleReceivedData colorFrame;
depthFrame = dsCam.getDetphData();
...
有时应用程序在dsCam.getDepthData()
中崩溃。
我认为发生问题的原因是当此方法返回时正在复制数据,并且在复制操作过程中我获得了新数据。
我使用一个线程,因为外部库没有提供非阻塞机制来获取数据。它只是提供了一个基于事件的机制。
我担心如果我使用互斥锁定/解锁机制我的FPS会下降,但我会尝试...请给我一些想法。
答案 0 :(得分: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;
}