Предположим, что вашему приложению необходимо запустить функцию в нескольких потоках, число которых больше, чем количество ядер/потоков ЦП. Один из способов - использовать 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();
}
Поскольку количество потоков больше, чем количество ядер ЦП, при запуске потоки должны переключаться между разными ядрами.
Вопрос в том, имеют ли два подхода разные действия или нет? то есть переключение a QThread
отличается от того, которое выполняется с помощью QtConcurrent::run
?