C++ Qt/C++;将辅助线程的父级更改为qthread失败

C++ Qt/C++;将辅助线程的父级更改为qthread失败,c++,multithreading,qt,move,qobject,C++,Multithreading,Qt,Move,Qobject,为了简化清理工作,我希望将worker对象的父对象设置为它移动到的Qthread。(见下文) 就在start()行之前,我添加了: worker->setParent(TelnetConnectionThread); 但在运行时,我看到一个错误,我不能这样做,因为新的父线程位于不同的线程中。这怎么可能?在上面的一行中,我将工作线程移动到新线程…因此工作线程应该与TelnetConnectionThread位于同一线程中。帮忙 我用一些qDebug和thread()确认了worker确实

为了简化清理工作,我希望将worker对象的父对象设置为它移动到的Qthread。(见下文)

就在start()行之前,我添加了:

worker->setParent(TelnetConnectionThread);
但在运行时,我看到一个错误,我不能这样做,因为新的父线程位于不同的线程中。这怎么可能?在上面的一行中,我将工作线程移动到新线程…因此工作线程应该与TelnetConnectionThread位于同一线程中。帮忙



我用一些qDebug和thread()确认了worker确实被移动到了新线程

我认为您对QThread有点困惑。第一个问题是它的名字很容易引起误解,因为它实际上不是一个线程,而是一个线程控制器。下一个问题是线程关联(对象实际运行的线程)

如果我们在主线程中启动并创建一个新的QThread,线程控制器将在main线程中实例化:-

QThread* pThread = new QThread;
QObject* pObject = new QObject;
pObject->moveToThread(pThread);
接下来,线程将启动:-

pThread->start();
即使pThread被认为运行在不同的线程中,其线程关联性仍然是main线程,但是任何移动到pThread的基于QObject的类实例都将具有新线程的线程关联性:-

QThread* pThread = new QThread;
QObject* pObject = new QObject;
pObject->moveToThread(pThread);
尽管如此,pThread的线程关联是主线程,而pObject的线程关联是新线程;记住,pThread实际上是一个线程控制器

将POObject的父对象设置为pThread将是错误的,因为它们具有不同的线程关联。这是许多人在尝试从QThread继承时遇到的问题,而不是将其作为单独的实体使用并将QObject移动到其中。通常发生的情况是,有时在继承的QThread类的构造函数中创建对象,而没有将它们作为父对象,也没有意识到这些对象将具有主线程的线程关联性,而不是它们所期望的新线程

将QObject移动到另一个线程也会移动其子线程,因此尝试将父线程设置为线程(线程控制器!)是没有意义的

总之,您不能将worker对象的父对象设置为TelnetConnectionRead,因为它们在不同的线程上运行

但是,如果您试图在完成线程清理后进行线程清理,则可以执行以下操作:-

connect(TelnetConnectionThread, SIGNAL(finished()), TelnetConnectionThread, SLOT(deleteLater()));

我认为您对QThread有点困惑。第一个问题是它的名字很容易引起误解,因为它实际上不是一个线程,而是一个线程控制器。下一个问题是线程关联(对象实际运行的线程)

如果我们在主线程中启动并创建一个新的QThread,线程控制器将在main线程中实例化:-

QThread* pThread = new QThread;
QObject* pObject = new QObject;
pObject->moveToThread(pThread);
接下来,线程将启动:-

pThread->start();
即使pThread被认为运行在不同的线程中,其线程关联性仍然是main线程,但是任何移动到pThread的基于QObject的类实例都将具有新线程的线程关联性:-

QThread* pThread = new QThread;
QObject* pObject = new QObject;
pObject->moveToThread(pThread);
尽管如此,pThread的线程关联是主线程,而pObject的线程关联是新线程;记住,pThread实际上是一个线程控制器

将POObject的父对象设置为pThread将是错误的,因为它们具有不同的线程关联。这是许多人在尝试从QThread继承时遇到的问题,而不是将其作为单独的实体使用并将QObject移动到其中。通常发生的情况是,有时在继承的QThread类的构造函数中创建对象,而没有将它们作为父对象,也没有意识到这些对象将具有主线程的线程关联性,而不是它们所期望的新线程

将QObject移动到另一个线程也会移动其子线程,因此尝试将父线程设置为线程(线程控制器!)是没有意义的

总之,您不能将worker对象的父对象设置为TelnetConnectionRead,因为它们在不同的线程上运行

但是,如果您试图在完成线程清理后进行线程清理,则可以执行以下操作:-

connect(TelnetConnectionThread, SIGNAL(finished()), TelnetConnectionThread, SLOT(deleteLater()));

在连接插槽之前,应先移动到螺纹,以确保连接正确type@ratchetfreak为什么呢连接类型是在信号发出时确定的。@thuga my bad我的印象是自动连接被转换为直接连接或连接时的队列time@ratchetfreak是的,我也这么想了很长时间。我不确定我是从哪里得到这些信息的,但我肯定我在什么地方读到过。但后来我注意到,在Qt文档中,它说:
连接类型是在信号发出时确定的。
。在连接插槽之前,您应该移动到线程,它确保连接正确type@ratchetfreak为什么呢连接类型是在信号发出时确定的。@thuga my bad我的印象是自动连接被转换为直接连接或连接时的队列time@ratchetfreak是的,我也这么想了很长时间。我不确定我是从哪里得到这些信息的,但我肯定我在什么地方读到过。但是后来我注意到Qt文档中说:
连接类型是在信号发出时确定的。
。啊!我想我明白了。现在,我希望在删除pThread时自动删除QObject。这是可能的(我猜不是通过setparent)…还是我必须设置另一个绑定到worker的deletelater的信号?在示例代码中,您已经将线程的完成信号连接到worker的deletelater插槽,该插槽将执行您的要求。抱歉-我指的是QThread对象,因此,我必须设置另一个信号。请参阅答案底部的connect语句,这不是您要求的吗?啊!我想我明白了。现在,我希望在删除pThread时自动删除QObject。这是可能的(我想不是通过setparent)…还是我会