从线程获取连续处理的数据的正确方法是什么?

时间:2019-07-11 01:00:29

标签: multithreading qt thread-safety qt5

以下功能和字段是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;
}

2 个答案:

答案 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。