アプリケーションが、CPU コア/スレッドの数よりも多い数の複数のスレッドで関数を実行する必要があるとします。1 つの方法はQtConcurrent
、最大スレッド数を使用して設定することです。
MyClass *obj = new MyClass;
QThreadPool::globalInstance()->setMaxThreadCount(30);
for(int i=0;i<30;i++)
QtConcurrent::run(obj, &MyClass::someFunction);
別の方法は、複数のオブジェクトを持ち、次を使用してそれらを別のスレッドに移動することmoveToThread
です。
for(int i=0;i<30;i++)
{
MyClass *obj = new MyClass;
QThread *th = new QThread();
obj->moveToThread(th);
connect(th, SIGNAL(started()), obj, SLOT(someFunction()) );
connect(obj, SIGNAL(workFinished()), th, SLOT(quit()) );
connect(th, SIGNAL(finished()), obj, SLOT(deleteLater()) );
connect(th, SIGNAL(finished()), th, SLOT(deleteLater()) );
th->start();
}
スレッドの数は CPU コアの数よりも多いため、実行時にスレッドを異なるコア間で切り替える必要があります。
問題は、2 つのアプローチのパフォーマンスが異なるかどうかです。つまり、 の切り替えは、QThread
を使用して実行されるものとは異なりますQtConcurrent::run
か?