0

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

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

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

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

4

2 回答 2

2

正如@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。

希望这能让你在某个地方......

于 2012-07-12T12:40:30.517 回答
0

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

填写您在此模型的实现中收到的数据,并将其添加到表格视图中

yourtableview->setmodel(yourtablemodel)

那么你就不需要 Refresh() 函数或类似的东西了。表格视图将始终显示模型的内容。

于 2012-07-13T09:32:10.537 回答