を使用しmoveToThread
て、オブジェクトのスレッドアフィニティを変更できます。OPが求めるのは、同じクラスの2つの関数を異なるスレッドで実行する方法です。
クラスA
と2つの関数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
すでに異なるスレッドで関数を実行するためのクラスが提供されており、QtConcurrentRun
このQtConcurrent::run()
関数は、別のスレッドで関数を実行します。関数の戻り値は、QFuture
APIを介して利用可能になります。
トリガーされる関数は、外部関数またはメンバー関数のいずれかです。したがって、この場合、オブジェクト自体から開始f1
しf2
、別のスレッドで次のことを実行したい場合は、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);
}
同様に、任意のクラスの任意のパブリック関数を同時に実行できます。
QImage image = ...;
QFuture<void> future = QtConcurrent::run(image, &QImage::invertPixels, QImage::InvertRgba);
A a;
QFuture<void> future1 = QtConcurrent::run(A, &A::f1);
2つの呼び出しの違いに注意してください。
QtConcurrent::run()
メンバー関数へのポインターも受け入れます。最初の引数は、const参照またはクラスのインスタンスへのポインターのいずれかである必要があります。const参照による受け渡しは、constメンバー関数を呼び出すときに役立ちます。ポインターの受け渡しは、インスタンスを変更する非constメンバー関数を呼び出す場合に役立ちます。
同時に実行される関数がいつ終了したかを確認するには、を使用する必要がありますQFutureWatcher
。