是否可以将 QtConcurrent::run() 与类的函数成员一起使用

Posted

技术标签:

【中文标题】是否可以将 QtConcurrent::run() 与类的函数成员一起使用【英文标题】:is it possible to use QtConcurrent::run() with a function member of a class 【发布时间】:2010-01-28 04:48:57 【问题描述】:

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

使用常规函数,我无法发出信号,这很麻烦。为什么有人会发现这是QThread 的更好替代方案,这超出了我的理解,并希望得到一些意见。

【问题讨论】:

请注意,虽然您可以在线程中发出信号,但无论使用哪种方法,它都可能不会创建小部件。只有主 GUI 线程可以。此外,主 GUI 线程可能需要处理信号。 【参考方案1】:

是的,这是可能的(而且非常简单)。

这是一个示例(来自 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

【讨论】:

让我花费一些时间的一件事是 QtConcurrent 不喜欢重载函数:D pass a pointer -- 请注意,您的示例中的 string 不是(但我猜应该是);)【参考方案2】:

问题在于,当您使用指向成员函数的指针时,您还需要以某种方式提供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(&amp;Dog::walkTheDog), &amp;dog) 返回一个类似函数的对象,该对象已将成员函数绑定到特定的狗。从那时起,您可以像使用独立函数一样使用它。

【讨论】:

你能看看这个问题吗,我遇到过这样的问题,***.com/questions/47792153/…

以上是关于是否可以将 QtConcurrent::run() 与类的函数成员一起使用的主要内容,如果未能解决你的问题,请参考以下文章

停止由 QtConcurrent::run 启动的线程?

QtConcurrent::run 发出信号

如何将 QtConcurrent::run 函数(或类似函数)中的 progressText 传递给 QFutureWatcher?

QtConcurrent::run 异常通知

QtConcurrent 运行的线程 id

QtConcurrent::run 如何停止后台任务