使用moveToThread,我们可以改变对象的线程亲和性。 OP 要求的是我们如何在不同的线程中运行同一类的两个函数。
让类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已经提供了一个在不同线程中运行函数的类,它被称为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);
注意这两个调用之间的区别:
QtConcurrent::run() 也接受指向成员函数的指针。这
第一个参数必须是 const 引用或指向
类的实例。通过 const 引用传递在以下情况下很有用
调用 const 成员函数;通过指针传递对
调用修改实例的非常量成员函数。
为了检查并发执行的函数何时完成,您应该使用QFutureWatcher。