同步睡眠和QTimer

时间:2012-07-12 11:29:52

标签: qt sleep boost-thread

我有两个班级:A班和B班。

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

B类由QThread定义,在run函数中,我借助套接字和所有函数从客户端获取数据。

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

2 个答案:

答案 0 :(得分:2)

在@tyke建议的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。

希望这能让你到达某个地方......

答案 1 :(得分:0)

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

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

将其添加到表格视图中
yourtableview->setmodel(yourtablemodel)

然后你不需要Refresh()函数或类似的东西。 tableview将始终显示模型的内容。

相关问题