同步睡眠和QTimer

同步睡眠和QTimer,qt,sleep,boost-thread,Qt,Sleep,Boost Thread,我有两个班:A班和B班 在类A中,我有一个私有插槽Refresh,它每两秒钟使用QTimer调用一次,帮助更新QTableView中的值 类B由QThread定义,在run函数中,我在sockets和all的帮助下从客户端获取数据 现在的问题是,当run从客户机获取数据时,QTimer会更新表,从而在不更新所有数据的情况下进行更新。有时更新较少,反之亦然。如果我们同步数据时,Refresh函数起作用,那么就可以做到这一点。但是我该怎么做呢?因为刷新属于另一个类,所以我想到了一种将QTimer与s

我有两个班:A班和B班

在类A中,我有一个私有插槽
Refresh
,它每两秒钟使用QTimer调用一次,帮助更新QTableView中的值

类B由QThread定义,在
run
函数中,我在sockets和all的帮助下从客户端获取数据

现在的问题是,当
run
从客户机获取数据时,QTimer会更新表,从而在不更新所有数据的情况下进行更新。有时更新较少,反之亦然。如果我们同步数据时,
Refresh
函数起作用,那么就可以做到这一点。但是我该怎么做呢?因为刷新属于另一个类,所以我想到了一种将QTimer与sleep同步的方法,或者一种只能在类B中调用该函数的方法。

按照@spyke的建议,在Qt中使用互斥体(QMutex)。在包含数据的类中添加互斥体

在类的头文件中:

class MyDataClass : public QObject
{
    Q_OBJECT
    ...

signals: 
    void dataChanged();
private:
    QMutex mutex;
    ....
在访问数据的方法中:

MyDataClass::accessFromAnyThread(QString newNode) {
    mutex.lock();
    ...
    //access critical data e.g.
    this->data.append(newNode);
    ...
    mutex.unlock();
    emit dataChanged();
}
如果你同时进行阅读和写作,如果你有性能问题,你应该研究QSermaphore


希望这能让你有所收获……

我不完全确定你想做什么,但我认为你可以使用QAbstractTableModel

填写此模型实现中收到的数据,并通过

yourtableview->setmodel(yourtablemodel)

这样就不需要Refresh()函数之类的函数了。tableview将始终显示模型的内容。

使用共享数据,在QTableView中使用critical section读取和更新它,并改进您的计时器间隔。@spyke even i now我应该改进我的计时器间隔。这是您告诉我的一件显而易见的事情。我在问我是否可以同步它,因为我在不同的文件中定义了这两个类,所以我甚至不能使用全局参数。显然,您可以开始从其他类读取数据,并在另一个文件[数据读取类]中使用互斥体。您可以给我一个互斥体示例,说明如何声明它,以及如果这两个函数位于两个不同的文件中,如何使用它。请帮我解决,我在@spykein的一个函数中获取数据,在另一个ie刷新函数中,我使用QStandardItem ino QTableView更新视图,这让我久久无法理解。我的数据被填充到一个定义为静态的映射中,填充后我希望Refresh函数启动。这是我想要的,但现在由于这个刷新函数在另一个类中独立工作,并且在两个类之间启动。您的示例看起来不错,我想类似的东西会起作用,但在哪个类中我必须声明互斥,然后是如何访问它,然后是thsi QString和all。请帮助QString只是一个示例参数。您可以在mutex.unlock语句之后发出信号,并将其连接到视图。那个怎么样?好的,我看到了一个例子。但我怎么能在两个类中使用相同的互斥。我的意思是,在一个类中使用变量时不会出现错误。答案比那个更一般。MyDataClass不直接表示任何一个类。我相信你可能也有架构上的问题,但如果不了解整个情况,很难说。操纵QTableView的类(A)可以从从从客户端获取数据的线程调用一个方法。每次访问QTableView时,都应该锁定互斥锁,然后在完成后解锁。这样,当另一个正在访问QTableView时,计时器/客户端将阻塞。请展示更多的代码和对象如何交互。