18

QtConcurrent::run()単純な関数だけではメソッド(クラスの関数メンバー)に関連付けることができないようです。これどうやってするの?

通常の機能では、信号とその抗力を発することはできません。なぜ誰かがこれがQThread私を超えたより良い代替案であると思うので、いくつかの入力が必要です。

4

2 に答える 2

21

はい、これは可能です(そして非常に簡単です)。

次に例を示します(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();

基本的に、あなたがしなければならないのは、最初の引数としてオブジェクトへのポインタを渡し、2番目の引数としてメソッドのアドレスを渡すことです(他の引数が続きます)。

参照:https ://doc.qt.io/qt-5/qtconcurrentrun.html

于 2010-01-28T05:18:07.483 に答える
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)メンバー関数を特定の犬にバインドした関数のようなオブジェクトを返します。その時点から、スタンドアロン機能を使用するのと同じように使用できます。

于 2010-01-28T05:15:12.917 に答える