18

我似乎无法QtConcurrent::run()仅与一个简单的函数关联一个方法(类的函数成员)。我怎样才能做到这一点?

使用常规功能,我无法发出信号并且它很拖累。为什么有人会发现这是一个更好的替代方案,QThread这超出了我的范围,并且想要一些输入。

4

2 回答 2

21

是的,这是可能的(而且很容易)。

这是一个示例(来自 Qt 文档):

// call 'QStringList QString::split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const' in a separate thread
QString string = ...;
QFuture<QStringList> future = QtConcurrent::run(string, &QString::split, QString(", "), QString::KeepEmptyParts, Qt::CaseSensitive);
...
QStringList result = future.result();

基本上,您所要做的就是将指向对象的指针作为第一个参数传递,并将方法的地址作为第二个参数传递(后面是任何其他参数)。

见:https ://doc.qt.io/qt-5/qtconcurrentrun.html

于 2010-01-28T05:18:07.483 回答
5

问题是,当您使用指向成员函数的指针时,您还需要以某种方式提供this参数(即,应该调用成员函数的对象)。

如果您以前没有使用过它,那么它的语法是相当困难的。阅读http://www.parashift.com/c++-faq-lite/pointers-to-members.html可能会很好。

假设你有一个类Dog和一个函数Dog::walkTheDog(int howlong_minutes)。那么您应该能够使用std::bind1ststd::mem_fun使其适用于QtConcurrent::run

Dog dog;
// Walk this dog for 30 minutes
QtConcurrent::run(std::bind1st(std::mem_fun(&Dog::walkTheDog), &dog), 30);

std::bind1st(std::mem_fun(&Dog::walkTheDog), &dog)返回一个类似函数的对象,该对象已将成员函数绑定到特定的狗。从那时起,您可以像使用独立函数一样使用它。

于 2010-01-28T05:15:12.917 回答