2013-10-05 2 views
0

J'ai un programme simple (un peu) qui crée de nouveaux threads, une par connexion à une prise:QObject: findChildren et QThread

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

après un nouveau thread est créé, la sortie I qDebug une liste de tous enfants du parent qui a créé les qthreads (TelnetConnection) comme ceci:

QList<QObject*> activeTelnetConnections = m_telnetserver->findChildren <QObject *>(); // Find all QThreads that children of telnetserver 
qDebug() << "Children: " << activeTelnetConnections; 

depuis mes qthreads decend de QObject, je voir une liste des qthreads et plus. Cependant, je ne peux pas trouver les Qthreads! C'est tout ce que je vois:

Children: (QNativeSocketEngine(0x7eb880) , QSocketNotifier(0x7ea5f0)) 

Pourquoi ne vois-je pas les fils enfants? Cela signifie-t-il que les threads ne sont plus associés à l'objet parent? Ou est-ce que je fais quelque chose de mal ici ...

Répondre

1

Cela signifie-t-il que les threads ne sont plus associés à l'objet parent?

Il n'a peut-être jamais été associé. Lorsque vous construisez le thread, vous devez lui passer le parent, mais votre TelnetConnection semble être faux car il ne s'attend pas à un argument parent, ou vous ne transmettez pas ce qui passe en interne à la classe de base avec le constructeur suivant .

QThread(QObject * parent = 0) 

ou vous devez appeler setParent() plus tard.

void QObject::setParent(QObject * parent) 

Cela signifierait thread.setParent (this); pour votre code, mais je suggérerais plutôt de réparer votre constructeur de classe de thread ou son invocation. Vous pouvez également définir explicitement l'enfant pour le TelnetConnection, mais je suggérerais la construction correcte si possible.

+0

C'était comme ça - j'ai dû mettre le parent sur la ligne d'initialisation du constructeur et ensuite ils étaient visibles! – TSG