Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt插槽参数已损坏_C++_Multithreading_Qt_Qthread - Fatal编程技术网

C++ Qt插槽参数已损坏

C++ Qt插槽参数已损坏,c++,multithreading,qt,qthread,C++,Multithreading,Qt,Qthread,原来的代码太大了,可以贴在这里。基本上,我是这样做的: class MySuperClass { QThread thread; MyClass myObject; MySuperClass() { connect( this, &MySuperClass::onKill, &myObject, &MyClass::stop ); connect( &thread, &QThread

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

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);
    }
}
class-MySuperClass
{
QThread线程;
MyClass myObject;
MySuperClass()
{
连接(this,&MySuperClass::onKill,&myObject,&MyClass::stop);
连接(&thread、&QThread::started、&myObject、&MyClass::loop);
连接(&myObject、&MyClass::finished、&thread、&QThread::quit);
myObject.moveToThread(&thread);
qRegisterMetaType(“uint32_t”);
连接(this、&MySuperClass::change、&myObject、&MyClass::onChange);
}
void do()
{
发射改变(0);
}
}
“onKill-stop”信号/插槽没有参数,工作正常。没问题

问题是'change-onChange'对。它们有一个类型为uint32\u 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()槽

只要在调用
myThread->start()

注意


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

有一种奇怪的东西:qRegisterMetaType(“uint32_t”);这不应该是qRegisterMetaType(“uint32_t”);ChrisG可能已经指出了您的问题(+1)。然而,您可以使用quint32(它可以与uint32_t互换),但它是预先注册的,这样您就可以避免注册它和犯难以发现的错误:)@ChrisG riilight,我太傻了!愚蠢的复制粘贴错误。我没有注意到3043426304在两个最低有效位中有零。非常感谢。你能回答我的意见吗?这样我就可以接受了?(尽管我仍然对moveToThread和connect调用的顺序感兴趣)。@code\u fodder我真的不明白为什么每个人都必须为固定长度类型创建自己的typedef。Qt中有quint32,Glib中有guint32,uC/OS中有SINT32-如果有standart typedefs,为什么还要麻烦呢?@Amomum好吧,这只是Qt的一个东西,你可以得到一个“免费注册”的类型。但我完全同意你的看法,我总是在任何地方使用uint16。但在Qt中,使用其内置类型时会少一些匆忙。我在一个单独的函数中启动线程,所以忘了将其包含在伪代码中。@amomem啊,好吧,很公平:)。。。那么我认为你不应该有任何问题。您的线程有什么问题?@amumum还值得注意的是,您的连接类型(默认为“自动”)意味着您的信号是Qt::QueuedConnection,一旦您将对象移动到另一个线程(而在移动之前,它们将是直接连接)。。。在我的示例中,我更喜欢始终使用排队连接,除非我有理由使用directChris,并且您已经解决了我的所有问题,为此我感谢您:)