我有一个(有点)简单的程序创建新线程,每个连接一个套接字一个:
void TelnetServer::incomingConnection(qintptr socketDescriptor)
{
TelnetConnection *thread = new TelnetConnection(socketDescriptor);
connect(thread, SIGNAL(shutdownRequested()), m_controller, SLOT(shutdown()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
创建新线程后,我向qDebug输出创建QThreads(TelnetConnection)的父项的所有子项的列表,如下所示:
QList<QObject*> activeTelnetConnections = m_telnetserver->findChildren <QObject *> (); // Find all QThreads that children of telnetserver
qDebug() << "Children: " << activeTelnetConnections;
由于我的QThreads来自Qobject,我希望看到一个QThreads列表等等。但是,我找不到Qthreads!这就是我所看到的:
Children: (QNativeSocketEngine(0x7eb880) , QSocketNotifier(0x7ea5f0) )
为什么我看不到子线程?这是否意味着线程不再与父对象相关联?或者我在这里做错了什么......
答案 0 :(得分:1)
这是否意味着线程不再与父对象相关联?
它可能从未被关联过。构造线程时,需要将父节点传递给它,但是TelnetConnection
似乎是错误的,因为它不期望父参数,或者你没有传递内部传递给基类的那个使用以下构造函数。
QThread(QObject * parent = 0)
或者您必须稍后调用setParent()。
void QObject::setParent(QObject * parent)
这意味着thread.setParent(this);对于你的代码,但我宁愿建议修复你的线程类构造函数或调用它。
或者,您也可以明确设置TelnetConnection的子节点,但如果可能的话,我会建议正确的构造。