QObject:findChildren和QThread

时间:2013-10-05 04:14:14

标签: c++ qt qthread qtcore qobject

我有一个(有点)简单的程序创建新线程,每个连接一个套接字一个:

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) ) 

为什么我看不到子线程?这是否意味着线程不再与父对象相关联?或者我在这里做错了什么......

1 个答案:

答案 0 :(得分:1)

  

这是否意味着线程不再与父对象相关联?

它可能从未被关联过。构造线程时,需要将父节点传递给它,但是TelnetConnection似乎是错误的,因为它不期望父参数,或者你没有传递内部传递给基类的那个使用以下构造函数。

QThread(QObject * parent = 0)

或者您必须稍后调用setParent()。

void QObject::setParent(QObject * parent)

这意味着thread.setParent(this);对于你的代码,但我宁愿建议修复你的线程类构造函数或调用它。

或者,您也可以明确设置TelnetConnection的子节点,但如果可能的话,我会建议正确的构造。