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



以下函数和字段是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。

相关内容

最新更新