以下函数和字段是Visual Studio DLL中同一类的一部分。使用线程上的 run
函数不断读取和处理数据。但是,getPoints
正在QTimer
上的Qt
应用程序中访问。我不想错过任何一个经过处理的向量,因为它似乎可能会跳过导致跳跃数据。获得更新版本积分的最安全方法是什么?
如果可能的话,我想要一个使用 C++ 标准库的答案,因为我一直在探索互斥库,但它似乎仍然会导致跳跃数据。
vector<float> points;
// std::mutex ioMutex;
// function running on a thread
void run(){
while(running){
//ioMutex.lock()
vector<byte> data = ReadData()
points = processData(data);
//ioMutex.unlock()
}
}
vector<float> getPoints(){
return points;
}
我相信你的代码中有错误。while 循环将消耗所有进程活动,并且不允许其他函数正常运行。在Qt中,在这种连续循环中,通常使用以下内容是一个好习惯,因为它实际上为其他进程提供了正确访问事件缓冲区的时间。如果这个dll是用Qt写的,请在while循环中添加以下内容
QCoreApplication::processEvents();
点数据传递到主线程的最安全(也可能是最简单的(方法是使用自定义 QEvent 子类的对象调用 qApp->postEvent()
,该对象包含您的vector<float>
作为成员变量。
这将导致从主/GUI 线程内部调用 event(QEvent *)
方法(无论您指定为要postEvent()
的第一个参数(,因此您可以覆盖该方法以从 QEvent 子类化对象中读取vector<float>
并使用该数据更新 GUI。