2010-01-28 165 views
16

我似乎無法將QtConcurrent::run()與方法(類的函數成員)關聯,只有一個簡單的函數。我怎樣才能做到這一點?是否有可能使用QtConcurrent :: run()與類的函數成員

使用常規功能,我不能發射信號及其拖動。爲什麼會有人發現這是一個更好的選擇QThread是超出我的,並希望一些輸入。

+0

注意的是,雖然你可能會發出一個信號,在一個線程中,使用這兩種方法,它可能不會產生小部件。只有主GUI線程可以。另外,主GUI線程可能需要處理信號。 – CodeLurker 2017-07-22 22:44:33

回答

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

一QtConcurrent不喜歡重載函數:D – hakermania 2014-11-27 13:48:14

+0

'傳遞一個指針' - 注意,在你的例子中'string'不是(但應該是,我猜);) – mlvljr 2015-11-13 18:55:03

5

問題是,當您使用指向成員函數的指針時,您還需要以某種方式提供this參數(即應該調用成員函數的對象)。

如果您以前沒有使用過,則此語法非常困難。閱讀http://www.parashift.com/c++-faq-lite/pointers-to-members.html可能會很好。

假設你有一個類Dog和一個函數Dog::walkTheDog(int howlong_minutes)。然後,你應該能夠使用std::bind1ststd::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 – 2017-12-14 13:51:42

相關問題