以下功能和字段是Visual Studio DLL中同一类的一部分。使用run
函数在线程上连续读取和处理数据。但是,正在getPoints
上的Qt
应用程序中访问QTimer
。我不会错过任何一个经过处理的向量,因为看起来它可能会跳过而导致跳动的数据。获得更新版本积分的最安全方法是什么?
如果可能的话,我希望得到一个使用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;
}
答案 0 :(得分:0)
我相信您的代码有误。 while循环将消耗所有流程活动,并且将不允许其他功能正常运行。在Qt中,在这种连续循环中,通常使用以下代码是一个好习惯,因为它实际上为其他进程提供了正确访问事件缓冲区的时间。如果此dll是用Qt编写的,请在while循环内添加以下内容
QCoreApplication::processEvents();
答案 1 :(得分:0)
将点数据传递到主线程的最安全(也是最简单的方法)是使用包含您的qApp->postEvent()
作为成员的自定义QEvent子类的对象调用vector<float>
变量。
这将导致从主/ GUI线程内部调用event(QEvent *)
方法(无论您指定为postEvent()
的第一个参数的Qt对象是什么),因此可以覆盖该方法以从QEvent子类化对象中读取vector<float>
,然后使用该数据更新GUI。