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

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

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

16
задан demonplus 9 October 2016 в 16:11
поделиться

2 ответа

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

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

19
ответ дан 30 November 2019 в 21:45
поделиться

Проблема в том, что когда вы Используйте указатель на функцию элементов, вам необходимо как-то предоставить этот параметр также (т. Е. Объект, на котором должна называться функция элемента).

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

5
ответ дан 30 November 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: