Qt插槽参数已损坏

Qt slot argument is corrupted

本文关键字:已损坏 参数 插槽 Qt      更新时间:2023-10-16

原始代码太大了,无法发布在这里。基本上,我是这样做的:

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);
    }
}

"onKill-stop"信号/插槽没有参数,工作正常。这里没问题。

问题是"changed-onChange"对。它们有一个类型为uint32_t的参数(我已经注册了它)。

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

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

我对此感到很困惑。首先:堆栈分配的整数类型参数是如何被破坏的?如果它是堆分配的或在多个线程中使用的,我会理解的。

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

问题1由Chris回答。对于问题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->start()"函数来启动线程。在创建对象时,重要的是要知道任何动态分配都将在父线程空间中创建,因为构造函数在你将其移动到线程之前就已经运行了。因此,最好实例化run()槽中所需的任何对象。

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

一旦启动线程,它就会发出started,并调用run()槽。

connect和moveToThread的顺序无关紧要,只要您在调用myThread->start() 之前完成所有这些操作

注意

这有利于启动线程。还有一些规则可以帮助您干净地终止线程。。。但这可能偏离了主题