在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
我在网上尝试了很多示例代码,但仍然感到困惑。如何使此代码顺利运行并保证线程安全?谢谢。
答案 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