QFuture<void> не будет работать

Я пытаюсь заставить мое приложение работать в нескольких потоках, чтобы сделать его процессы более эффективными. Я нашел на сайте Qt QFuture класс, который мог бы помочь мне. Я пытаюсь использовать как в одном из своих примеров. Ниже приведена часть моего объявления / определения класса.

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 секунд (он проверяет некоторые настройки базы данных). В течение этого времени графический интерфейс завис, и это приведет к ухудшению работы пользователей, поэтому я считаю, что это хорошее решение.

2 ответа

Решение

Вы должны предоставить указатель на объект, а также адрес функции-члена класса, например:

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

Если ваша функция имеет параметры, вы можете передать их:

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

dbsChanged() является функцией-членом - вам нужно предоставить объект, для которого она будет выполняться. Если вы хотите это на самом объекте, используйте this:

PreferencesWindow::PreferencesWindow(QWidget *parent = 0) {
    QFuture<void> fns = run(dbsChanged, this);
}
Другие вопросы по тегам