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