我似乎無法將QtConcurrent::run()
與方法(類的函數成員)關聯,只有一個簡單的函數。我怎樣才能做到這一點?是否有可能使用QtConcurrent :: run()與類的函數成員
使用常規功能,我不能發射信號及其拖動。爲什麼會有人發現這是一個更好的選擇QThread
是超出我的,並希望一些輸入。
我似乎無法將QtConcurrent::run()
與方法(類的函數成員)關聯,只有一個簡單的函數。我怎樣才能做到這一點?是否有可能使用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();
基本上,所有必須要做的是將指針傳遞到對象作爲第一個參數,並且所述方法的作爲第二個參數的地址(後面跟着任何其他參數)。
一QtConcurrent不喜歡重載函數:D – hakermania 2014-11-27 13:48:14
'傳遞一個指針' - 注意,在你的例子中'string'不是(但應該是,我猜);) – mlvljr 2015-11-13 18:55:03
問題是,當您使用指向成員函數的指針時,您還需要以某種方式提供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)
返回已綁定的成員函數到特定的狗功能狀物體。從這一點開始,您可以像使用獨立功能一樣使用它。
可以請你看看這個問題,我面臨這樣的問題,https://stackoverflow.com/questions/47792153/invalid-use-of-non-static-member-function-qtconcurrent?noredirect = 1#comment82546866_47792153 – 2017-12-14 13:51:42
注意的是,雖然你可能會發出一個信號,在一個線程中,使用這兩種方法,它可能不會產生小部件。只有主GUI線程可以。另外,主GUI線程可能需要處理信號。 – CodeLurker 2017-07-22 22:44:33