Qt插槽参数已损坏

时间:2016-04-19 10:48:16

标签: c++ multithreading qt qthread

原始代码很大,可以在这里发布。基本上,我这样做:

class MySuperClass 
{
    QThread thread;
    MyClass myObject;

    MySuperClass() 
    {

        connect( this, &MySuperClass::onKill, &myObject, &MyClass::stop );

        connect( &thread, &QThread::started, &myObject, &MyClass::loop );
        connect(&myObject, &MyClass::finished, &thread, &QThread::quit );

        myObject.moveToThread( &thread );

        qRegisterMetaType<uint16_t>("uint32_t");

        connect( this, &MySuperClass::changed, &myObject, &MyClass::onChange );
    }

    void do()
    {
        emit changed(0);
    }
}

&#39; onKill - 停止&#39;信号/插槽没有参数,工作正常。这里没问题。

问题已经改变 - onChange&#39;对。它们有一个类型为uint32_t的参数(我已注册)。

当我从主线程中调用MySuperClass的方法do时,会发出信号,调用插槽onChange,但它的参数不是0! 这是一个很大的数字,如3043426304。

有趣的是:如果我将连接类型更改为DirectConnection - 参数为零;如果我将连接类型更改为QueuedConnection - 参数也为零!怎么会这样?自动连接是排队还是直接?

我对此非常困惑。首先:堆栈分配的整数类型参数如何可能被破坏?我理解它是在多线程中堆分配还是在多线程中使用。

我的第二个问题是:我该如何正确地进行这种连接? connect和moveToThread的顺序是否重要?

1 个答案:

答案 0 :(得分:2)

问题1由克里斯回答。对于问题2(我没有看到第一次出现)......

这是设置在单独线程中运行的对象的方法:

// Create the myObject object in its own thread
QThread* myThread= new QThread(); // you can assign `this` as parent if you want...
MyObject* myObject= new MyObject(0); // Assign no parent here (for QObject)
QObject::connect(myThread, &QThread::started, myObject, &MyObject::run, Qt::QueuedConnection);
myObject->moveToThread(myThread);
myThread->start();

你大多数都是正确的。我认为你错过了“myThread-&gt; start()”函数来解决问题。在您的对象创建中,重要的是要知道在父线程空间中创建任何动态分配,因为构造函数在将其移动到线程之前运行。所以最好在run()槽中实例化你需要的任何对象。

启动线程后与对象的任何交互都应该通过插槽/信号。

启动线程后,它将启动并且将调用run()槽。

只要你在拨打myThread->start()

之前完成所有这些操作,connect和moveToThread的顺序无关紧要

注意

这对于启动线程很有用。有一些规则可以帮助你干净利落地终止线程......但这可能是偏离主题的