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

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();
}


创建新线程之后,我将创建QThreads(TelnetConnection)的父级的所有子级的列表输出到qDebug,如下所示:

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


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

最佳答案

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


它可能从未关联过。构造线程时,需要将父级传递给它,但是您的TelnetConnection似乎是错误的,因为它不希望有父级参数,或者您没有将内部传递的内容传递给基类。以下构造函数。

QThread(QObject * parent = 0)


否则您稍后必须调用setParent()。

void QObject::setParent(QObject * parent)


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

或者,您也可以为TelnetConnection显式设置子项,但如果可能的话,我建议适当的构造。

关于c++ - QObject:findChildren和QThread,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19193882/

10-10 23:19