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"信号/插槽没有参数,工作正常。这里没问题。
问题是"changed-onChange"对。它们有一个类型为uint32_t的参数(我已经注册了它)。
当我从主线程调用MySuperClass的方法do
时,会发出信号,调用slot-onChange,但它的参数不是0!这是一个很大的数字,比如3043426304。
有趣的是:如果我将连接类型更改为DirectConnection,则参数为零;如果我将连接类型更改为QueuedConnection,则参数也为零!这怎么可能?自动连接不是排队的还是直接的?
我对此感到很困惑。首先:堆栈分配的整数类型参数是如何被破坏的?如果它是堆分配的或在多个线程中使用的,我会理解的。
我的第二个问题是:我应该如何正确地进行这种连接?connect和moveToThread的顺序重要吗?
以下是如何设置在单独线程中运行的对象:
// 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()
之前完成所有这些操作
注意
这有利于启动线程。还有一些规则可以帮助您干净地终止线程。。。但这可能偏离了主题
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- 变量周围的堆栈'sortArray'已损坏
- 变量周围的堆栈'folderPath'已损坏
- 在为 iOS 构建 aws-sdk-cpp 时,cmake 上的 CXX 编译器错误已损坏
- 运行时检查失败 #2 - 变量周围的堆栈'...'已损坏
- AES-128 CFB-8解密的前16个字节已损坏
- 运行时检查失败 #2 - 变量"l1"周围的堆栈已损坏
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- 图像在本地主机上显示已损坏
- 检查工作正常的 CXX 编译器:/cygdrive/c/cygwin64/bin/clang++ -- 已损坏
- 数组变量周围的堆栈已损坏
- 指针函数参数已损坏,堆栈已损坏
- Qt插槽参数已损坏
- std::async - 参数向量已损坏