Qt 并发:从另一个类调用成员函数
Qt Concurrent: call member function from another class
在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();
相关文章:
- 无法调用成员函数,尝试正确执行此操作仍然失败
- 在 transform() 中调用成员函数
- C++::在构造函数退出之前通过指针调用成员函数
- 为什么我可以通过野生指针调用成员函数
- 从 Qt 中的信号调用成员函数的问题
- 调用C++成员函数指针,而不知道哪个类
- 如何从嵌套在命名空间中的类调用成员函数?
- 无法在非成员函数中调用成员函数
- 为什么分配了 nullptr 的指针可以调用成员函数?
- 通过带有成员函数指针的 QHash 调用成员函数的正确方法
- 使用可变参数模板调用成员函数
- 调用成员对象的构造函数
- 有没有办法在没有括号的情况下在C++中调用成员的getter/setter?
- 如何调用成员初始化器列表中参考成员的构造函数
- 使用按引用调用时,不能在没有对象的情况下调用成员函数 const
- 如果绝对没有调用成员函数,是否允许使用不完整类型的向量?如果是这样,从什么时候开始
- 在另一个成员函数中调用成员函数时'int'之前的预期主表达式
- 为什么调用成员函数不调用该对象的 ODR-USE?
- 如何在模板参数中调用成员
- 是否可以使用 EXPECT_CALL 来验证模拟对象的构造函数是否在某些时候调用成员函数?