Можно ли использовать QtConcurrent :: run () с функцией-членом класса - PullRequest
16 голосов
/ 28 января 2010

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

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

Ответы [ 2 ]

19 голосов
/ 28 января 2010

Да, это возможно (и довольно просто).

Вот пример (из документации 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

5 голосов
/ 28 января 2010

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

...