#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 ошибки :))