QFuture не будет работать

#c #multithreading #qt #qfuture

#c #многопоточность #qt #qfuture

Вопрос:

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

 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 amp;)' : expects 2 arguments - 1 provided
 

Где я ошибаюсь и как это сделать, чтобы запустить этот слот в другом потоке?

Зачем мне это нужно?Выполнение этого метода может занять до 30 секунд (он проверяет некоторые настройки базы данных). В течение этого времени графический интерфейс будет заморожен, и это приведет к ухудшению работы пользователя, поэтому я считаю это хорошим решением.

Ответ №1:

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

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

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

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

Ответ №2:

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

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

Комментарии:

1. это немного лучше. Сейчас я получаю только 42 ошибки :))