Я, может казаться, не могу связаться QtConcurrent::run()
с методом (функционируют член класса), только с простой функцией. Как я могу сделать это?
С регулярной функцией я не могу испустить сигналы, и это - перетаскивание. Почему кто-либо нашел бы это лучшей альтернативой QThread
вне меня и хотел бы некоторый вход.
Да, это возможно (и довольно просто).
Вот пример (из документации 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();
в основном, все, что вам нужно сделать, это передавать указатель на объект как первый аргумент и адрес способа в качестве второго аргумента (с последующим любым другим аргументы).
Проблема в том, что когда вы Используйте указатель на функцию элементов, вам необходимо как-то предоставить этот параметр
также (т. Е. Объект, на котором должна называться функция элемента).
Синтаксис для этого довольно сложно, если вы не использовали его раньше. Это может быть хорошо читать http://www.parashift.com/c++-faq-lite/pointers-To-members.html .
Скажем, у вас есть класс и функция
и функция Собака :: 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)
Возвращает функциональный объект, который связал функцию элементов к конкретной собаке. С этого момента вы можете использовать его так же, как вы можете использовать автономную функцию.