【问题标题】:QFuture<void> won't workQFuture<void> 不起作用
【发布时间】:2014-08-17 03:41:11
【问题描述】:

我正在尝试让我的应用程序在多个线程上运行,以提高其进程的效率。我在 Qt 的网站上找到了可以帮助我的 QFuture 模板类。我试图在他们的一个例子中使用 like 。以下是我的类声明/定义的一部分。

class PreferencesWindow {
public:
    PreferencesWindow(QWidget *parent = 0);
public slots:
    void dbsChanged();
}

PreferencesWindow::PreferencesWindow(QWidget *parent = 0) {
    QFuture<void> fns = run(dbsChanged);
}

当我尝试运行它时,我收到 48 个错误(来自这一行),例如:

error C2780: 'QFuture<FunctionObject::result_type> QtConcurrent::run(FunctionObject *,const Arg1 &)' : expects 2 arguments - 1 provided

我哪里错了,应该如何在不同的线程上运行该插槽?

我为什么要这个? 此方法的执行最多可能需要 30 秒(它会检查一些数据库设置)。在此期间,GUI 被冻结,这将导致糟糕的用户体验,所以我认为这是一个很好的解决方案。

【问题讨论】:

    标签: c++ multithreading qt qfuture


    【解决方案1】:

    您应该提供指向对象的指针以及类成员函数的地址,例如:

    QFuture<void> fns = QtConcurrent::run(this,&PreferencesWindow::dbsChanged);
    

    如果你的函数有参数,你可以通过:

    QFuture<void> fns = QtConcurrent::run(this,&PreferencesWindow::dbsChanged, val1, val2);
    

    【讨论】:

      【解决方案2】:

      dbsChanged() 是一个成员函数——你需要提供一个对象来执行它。如果您想在对象本身上使用它,请使用this

      PreferencesWindow::PreferencesWindow(QWidget *parent = 0) {
          QFuture<void> fns = run(dbsChanged, this);
      }
      

      【讨论】:

      • 好一点。我现在只收到 42 个错误 :))
      猜你喜欢
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 2016-05-30
      • 2022-06-16
      • 2013-12-29
      相关资源
      最近更新 更多