2010-01-28 2 views
16

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

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

+0

Обратите внимание, что в то время как вы можете излучать сигнал в потоке, используя любой метод, он не может создавать виджеты. Только основной поток GUI может. Кроме того, основной поток GUI, вероятно, потребуется обработать сигнал. – CodeLurker

ответ

19

Да, это возможно (и довольно легко).

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

+1

One вещь, которая стоила мне времени, заключается в том, что QtConcurrent не любит перегруженные функции: D – hakermania

+0

'передать указатель' - обратите внимание, что' string' в вашем примере нет (но должно быть, я думаю);) – mlvljr

5

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

+0

Не могли бы вы рассмотреть этот вопрос, я столкнулся с такой проблемой, https: //stackoverflow.com/questions/47792153/invalid-use-of-non-static-member-function-qtconcurrent? Noredirect = 1 # comment82546866_47792153 –