QtConcurrent::run()
単純な関数だけではメソッド(クラスの関数メンバー)に関連付けることができないようです。これどうやってするの?
通常の機能では、信号とその抗力を発することはできません。なぜ誰かがこれがQThread
私を超えたより良い代替案であると思うので、いくつかの入力が必要です。
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();
基本的に、あなたがしなければならないのは、最初の引数としてオブジェクトへのポインタを渡し、2番目の引数としてメソッドのアドレスを渡すことです(他の引数が続きます)。
問題は、メンバー関数へのポインターを使用するときに、何らかの方法で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)
メンバー関数を特定の犬にバインドした関数のようなオブジェクトを返します。その時点から、スタンドアロン機能を使用するのと同じように使用できます。