【问题标题】:Synchronizing sleep and QTimer同步睡眠和 QTimer
【发布时间】:2012-07-12 11:29:51
【问题描述】:

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

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

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

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

【问题讨论】:

  • 使用共享数据,使用关键部分在 QTableView 中读取和更新它,并改善你的计时器间隔。
  • @spyke 即使我现在我也应该改进我的计时器间隔。这是你告诉我的一件显而易见的事情。我问我可以同步吗,因为我已经在不同的文件中定义了这两个类,所以我什至不能使用全局参数。
  • 显然,您可以开始从其他类读取数据并在其他文件中使用互斥锁[数据读取类]。
  • 你能给我一个互斥锁的例子,我必须如何声明它,如果这两个函数在两个不同的文件中,我该如何使用它。请帮帮我,我被困住了很久以来@spyke

标签: qt sleep boost-thread


【解决方案1】:

按照@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。

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

【讨论】:

  • 在一个函数中,我正在获取数据,而在另一个函数中,即 Refresh 函数中,我正在使用 QStandardItem ino QTableView 更新视图。我的数据被填充到一个定义为静态的地图中,填充后我希望启动刷新函数。这就是我想要的,但现在因为这个刷新函数在另一个类中,它独立工作并在感觉之间开始
  • 你的例子看起来不错,我想这样的事情会起作用,但我必须在哪个类中声明互斥锁,然后如何访问它,然后是什么是 thsi QString 和 all。请帮助
  • QString 只是一个示例参数。您可以在 mutex.unlock 语句之后发出信号,并将其连接到您的视图。那怎么样?
  • 好的,我看到了一个例子。但是我如何在两个类中使用相同的互斥锁。我的意思是在另一个类中使用一个类的变量时不会出错
  • 我的回答比这更笼统。 MyDataClass 不直接代表您的任何一个类。我相信您也可能遇到架构问题,但如果没有看到整个事情就很难说。操作 QTableView 的类 (A) 可以具有从从客户端获取数据的线程调用的方法。每次访问 QTableView 时,您都应该锁定互斥锁,然后在完成后解锁。这样,定时器/客户端将在另一个访问 QTableView 时阻塞。请显示更多代码以及对象如何交互。
【解决方案2】:

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

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

yourtableview->setmodel(yourtablemodel)

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

【讨论】:

    猜你喜欢
    • 2013-12-24
    • 2014-09-23
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    相关资源
    最近更新 更多