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

时间:2017-12-13 07:38:49

标签: c++ multithreading qt c++11

在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

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

2 个答案:

答案 0 :(得分:4)

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

run

正确的形式是:

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

另请注意,之后调用QtConcurrent::run(&mcl, &myClass::foo, mvec, mstring); 实际上会阻塞您的线程,直到f1.waitForFinished();方法完成。所以你不会获得多线程的任何优势。

答案 1 :(得分:3)

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

  

QByteArray::split()也接受指向成员函数的指针。该   第一个参数必须是const引用或指向的引用   班级的实例。传递const引用非常有用   调用const成员函数;通过指针传递是有用的   调用修改实例的非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(); (const成员函数)   一个单独的线程是这样完成的:

myClass mcl;

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

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

OAuth