Возможно ли использовать QtConcurrent:: run() с членом функции класса
Кажется, я не могу связать QtConcurrent::run()
с методом (членом функции класса) только с простой функцией. Как я могу это сделать?
С обычной функцией я не могу испускать сигналы и их перетаскивание. Почему кто-нибудь найдет, что лучшая альтернатива QThread
выходит за рамки меня и хочет получить некоторый вклад.
Ответы
Ответ 1
Да, это возможно (и довольно легко).
Вот пример (из документации Qt):
// call 'QStringList QString::split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const' in a separate thread
QString string = ...;
QFuture<QStringList> future = QtConcurrent::run(string, &QString::split, QString(", "), QString::KeepEmptyParts, Qt::CaseSensitive);
...
QStringList result = future.result();
В принципе, все, что вам нужно сделать, это передать указатель на объект в качестве первого аргумента и адрес метода в качестве второго аргумента (за которым следуют любые другие аргументы).
Смотрите: https://doc.qt.io/qt-5/qtconcurrentrun.html
Ответ 2
Проблема заключается в том, что, когда вы используете указатель на функцию-член, вам нужно как-то предоставить параметр this
(т.е. объект, на который должна быть вызвана функция-член).
Синтаксис для этого довольно сложно, если вы раньше его не использовали. Возможно, было бы неплохо прочитать http://www.parashift.com/c++-faq-lite/pointers-to-members.html.
Скажем, у вас есть класс Dog
и функция Dog::walkTheDog(int howlong_minutes)
. Тогда вы должны использовать std::bind1st
и std::mem_fun
, чтобы сделать его подходящим для QtConcurrent::run
:
Dog dog;
// Walk this dog for 30 minutes
QtConcurrent::run(std::bind1st(std::mem_fun(&Dog::walkTheDog), &dog), 30);
std::bind1st(std::mem_fun(&Dog::walkTheDog), &dog)
возвращает объект, подобный функции, который привязал функцию-член к определенной собаке. С этого момента вы можете использовать его так же, как вы могли бы использовать автономную функцию.