【问题标题】:How to move function to QThread?如何将函数移动到 QThread?
【发布时间】:2016-03-22 16:42:19
【问题描述】:

我的 MainWindow 类中有一个名为 refreshLogDisplay() 的函数,它执行大量 UI 工作。里面的代码是这样的:

ui->tablewidget->setRowCount(100);
// ...     

因此该函数处理了 MainWindow 类的许多受保护属性。但我想将该函数移动到另一个 QThread。在那个 QThread 中,我想要一个 while 循环每秒调用 500 次“refreshLogDisplay”。每秒 500 次非常重要,我不希望任何计时器这样做,因为计时器太慢了。

我只知道如何实现一个继承QThread的子类,不能访问ui->tablewidget的东西。有一个QObject::moveToThread() 函数,但它似乎没有帮助。

有什么好的建议吗?

【问题讨论】:

  • 对于初学者,请检查显示器的刷新率。这是您将看到的每秒绝对最大数量的不同图像。如果显示器刷新率为 60 Hz,则无需使任何用户界面更新频率超过每秒 60 次。
  • 例如this question是关于从其他线程访问GUI。
  • 另请参阅此注释,了解为什么子类化 QThread 只是在向 QThread 添加尚未内置的管理功能时才想做的事情(与涉及代码的方法相反实际上在另一个线程上运行):blog.qt.digia.com/2010/06/17/youre-doing-it-wrong
  • 您不能在后台线程中进行 UI 工作。您可以决定在后台线程中做什么,但实际的 UI 操作无法在那里完成。更改表小部件的 rowCount 必须在 GUI 线程中完成,没有 ifs ands 或 buts。如果这是程序的缓慢部分,那么您只需要弄清楚如何减少执行频率即可。
  • 关于@Slavik81 所说的内容,请参阅我的答案,了解即使您将模型和视图小部件分开如何使用锁定来控制数据访问的细节,它不起作用:stackoverflow.com/questions/9485339/…

标签: qt real-time qthread qtablewidget


【解决方案1】:

您无法从线程控制 UI,您必须构建 Slot 并将它们连接到线程中的信号。 像这样:

void Whatever::increment(){i+=2;emit incremental();} 
void Default::Progress(){ui->tablewidget->setRowCount(i);}
void main(){ //do thread
connect(Whatever,SIGNAL(increamental()),this,SLOT(Progress()));}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 2017-10-17
    相关资源
    最近更新 更多