:
これは、ブログから単純化されたコードです。 OPが尋ねることは、同じクラスの2つの関数を異なるスレッドで実行する方法です。
レッツクラスA
との二つの機能f1
とf2
class A
{
public:
void f1();
void f2(int i);
void run(); // shows how we can trigger f1 and f2 in different threads
}
Qt
は、すでに別のスレッドで関数を実行するためのクラスを提供し、QtConcurrent::run()
関数は関数を実行しますQtConcurrentRun
と呼ばれています別スレッド この関数の戻り値は、QFuture
APIから利用できます。
トリガーされる機能は、外部機能またはメンバー機能のいずれかになります。我々はrun()
void run()
{
// QFuture<void> because f1 is void
QFuture<void> future1 = QtConcurrent::run(this, &A::f1);
int k = 5; // Concurrent run with arguments
QFuture<void> future2 = QtConcurrent::run(this, &A::f2, k);
}
で次の操作を行うことができ、異なるスレッドでf1
とf2
を開始するには、オブジェクト自体から望んでいたのであれば我々の場合においても同様に、あなたは、同時に例えば
QImage image = ...;
QFuture<void> future = QtConcurrent::run(image, &QImage::invertPixels, QImage::InvertRgba);
A a;
QFuture<void> future1 = QtConcurrent::run(A, &A::f1);
を任意のクラスの任意のパブリック関数を実行することができます
お知らせの二つの呼び出しの違いは:
QtConcurrent::run()
もメンバーfunctiへのポインタを受け入れますons。 最初の引数は、const参照またはクラスの インスタンスへのポインタである必要があります。 const参照を渡すことは、constメンバーの関数を呼び出すときに便利です。ポインタを渡すことは、 インスタンスを変更する非constメンバー関数を呼び出す場合に便利です。
同時に実行された機能が終了したときを確認するには、QFutureWatcher
を使用する必要があります。
関連:[QThreadブロッキングメインアプリケーション](http://stackoverflow.com/questions/3213738/) –