原始代码很大,可以在这里发布。基本上,我这样做:
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的顺序是否重要?
答案 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()
注意强>
这对于启动线程很有用。有一些规则可以帮助你干净利落地终止线程......但这可能是偏离主题的