【问题标题】:QtConcurrent::run() for a member function does not use the original instance成员函数的 QtConcurrent::run() 不使用原始实例
【发布时间】:2015-09-23 07:54:59
【问题描述】:

我想将QtConcurrent::run() 用于成员函数,但它似乎不使用指向实例的指针。相反,它看起来像调用了默认构造函数

#include <QObject>
#include <QDebug>
#include <QtConcurrent>

class Foo : public QObject
{
    Q_OBJECT
public:
    Foo(int n = 0):n(n){}
    Foo(const Foo & f):Foo(f.n){}

    void foo(){qDebug() << "Foo " << n;}
    void bar(){QtConcurrent::run(this, &Foo::foo);}

private:
    int n;
};

void test(){
  Foo foo = Foo(2);
  foo.foo();
  foo.bar();
  QtConcurrent::run(&foo, &Foo::foo);
  QtConcurrent::run(&foo, &Foo::bar);
}

而运行test()的结果是:

Foo  2
Foo  0 // Should be a 2
Foo  0 // Should be a 2
Foo  0 // Should be a 2

编辑:我的实例确实超出了范围。此代码运行良好

void test(){
    Foo * foo = new Foo(2);
    foo->foo();
    foo->bar();
    QtConcurrent::run(foo, &Foo::foo);
    QtConcurrent::run(foo, &Foo::bar);
}

【问题讨论】:

  • 顺便说一句,为什么fooQObject 的子类?
  • qDebug() 不是线程安全的。你不能在不同的线程中使用它。
  • @UmNyobe 因为我真正问题中的类继承自 QObject
  • @SaZ 你确定吗?我不认为你是对的。
  • “不使用原始实例” ...因为该实例不再存在

标签: qt qtconcurrent


【解决方案1】:

调用已销毁的对象是未定义的行为。实际情况是当QtConcurrent::run有效执行Foo::bar时,参数foo已经被破坏了。

如果我尝试复制您的代码,我有:

Foo  2 
Foo  1730312062 
Foo  1730312062 

问题来自于对象foo 在堆栈上,一旦test 返回就会失效。 为您的对象提供更长的生命周期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2015-06-28
    • 1970-01-01
    相关资源
    最近更新 更多