假设您的应用程序需要在多个线程中运行一个函数,其数量多于 CPU 内核/线程的数量。一种方法是使用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 内核数,因此在运行时应在不同内核之间切换线程。
问题是这两种方法是否有不同的表现?即 a 的切换QThread
与使用 运行的不同QtConcurrent::run
吗?