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()
之前完成所有这些即可
备注
这对于启动线程很有用。有一些规则可以帮助您干净地终止线程......但这可能会偏离主题
原代码太大,贴在这里。基本上,我是这样做的:
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()
备注
这对于启动线程很有用。有一些规则可以帮助您干净地终止线程......但这可能会偏离主题