Qt 插槽参数已损坏

Qt slot argument is corrupted

原代码太大,贴在这里。基本上,我是这样做的:

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' signal/slot 没有参数并且工作正常。这里没问题。

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

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

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

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

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

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

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

// 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()" 函数来启动线程。在您的对象创建过程中,重要的是要知道任何动态分配都将在父线程 space 中创建,因为在您将其移动到线程之前构造函数 运行s。所以最好在 运行() 槽内实例化任何你需要的对象。

启动线程后与对象的任何交互都应通过 slots/signals。

线程启动后,它会启动并调用您的 运行() 插槽。

connect 和 moveToThread 的顺序无关紧要,只要您在调用 myThread->start()

之前完成所有这些即可

备注

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