Qt 并发:从另一个类调用成员函数

Qt Concurrent: call member function from another class

本文关键字:调用 成员 函数 另一个 并发 Qt      更新时间:2023-10-16

在Qt Creator中,使用C++我必须多次从另一个类调用相同的函数。但是,这会减慢整体性能速度。所以为了做实时操作,我想到了使用多线程。经过一番搜索,我发现Qt Concurrent可能会有所帮助,因此请尝试以下步骤。

我的目标函数在此类中:

Class myClass
{
public foo(std::vector<float> inputVec, std::string inputStr);
}

在我的主课上,我这样做:

std::vector<float> mvec;
// here put some values into mvec;
std::string mstring = "test";
myClass mcl;
QFuture<float> f1 = QtConcurrent::run(mcl.foo(mvec, mstring));
f1.waitForFinished();

但是,这会给出错误,指出:

no matching function for call to 'run(float)'
'functor' cannot be used as a function
'float' is not a class, struct, or union type
...

我也尝试使用这样的std::thread

std::thread t1 = std::thread(mcl.foo, mvec, mstring);
if(t1.joinable()) t1.join();

但这会引发以下错误:

invalid use of non-static member function

我在网上尝试了很多示例代码,但仍然感到困惑。如何使此代码平稳运行且线程安全?谢谢。

以下语句执行foo方法并将其结果传递给run函数。

QtConcurrent::run(mcl.foo(mvec, mstring));

正确的形式是:

QtConcurrent::run(&mcl, &myClass::foo, mvec, mstring);

另请注意,在此之后调用f1.waitForFinished();实际上会阻塞您的线程,直到foo方法完成。因此,您将不会获得多线程的任何优势。

你必须传递(member-)函数本身(加上成员应该相关的对象),而不是仅仅调用它的结果。查看文档:

QtConcurrent::run()还接受指向成员函数的指针。这 第一个参数必须是 const 引用或指向 类的实例。在以下情况下,通过常量引用传递很有用 调用常量成员函数;通过指针传递对于 调用修改实例的非 const 成员函数。

例如,在 中调用QByteArray::split()(一个 const 成员函数) 一个单独的线程是这样完成的:

// call 'QList<QByteArray>  QByteArray::split(char sep) const' in a
separate thread QByteArray bytearray = "hello world";
QFuture<QList<QByteArray> > future = QtConcurrent::run(bytearray, &QByteArray::split, ',');
... 
QList<QByteArray> result = future.result();

因此,您的代码应该看起来像

myClass mcl;
QFuture<float> f1 = QtConcurrent::run(&mcl, &myClass::foo, mvec, mstring);
f1.waitForFinished();