Подтвердить что ты не робот

Возможно ли использовать QtConcurrent:: run() с членом функции класса

Кажется, я не могу связать QtConcurrent::run() с методом (членом функции класса) только с простой функцией. Как я могу это сделать?

С обычной функцией я не могу испускать сигналы и их перетаскивание. Почему кто-нибудь найдет, что лучшая альтернатива QThread выходит за рамки меня и хочет получить некоторый вклад.

4b9b3361

Ответ 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) возвращает объект, подобный функции, который привязал функцию-член к определенной собаке. С этого момента вы можете использовать его так же, как вы могли бы использовать автономную функцию.