2013-10-05 6 views
0

나는 새 스레드, 소켓에 연결 당 하나 만듭니다 (어느 정도) 간단한 프로그램이 있습니다QObject를 : findChildren와 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(); 
} 

새 스레드 후 생성을, I 출력이 모든 목록을 qDebug하기 이 같은 QThreads을 만든 부모 (TelnetConnection)의 어린이 : 내 QThreads는 QObject를에서 decend

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

때문에, 나는 QThreads 더 많은 목록을 볼 것으로 예상. 그러나 Qthreads를 찾을 수 없습니다! 이것이 내가 본 것입니다 :

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

왜 하위 스레드가 보이지 않습니까? 이것은 쓰레드가 부모 객체와 더 이상 연관되지 않는다는 것을 의미합니까? 아니면 여기서 뭔가 잘못하고있는 것입니까 ...

답변

1

스레드가 상위 개체와 더 이상 연관되어 있지 않다는 의미입니까?

연결되지 않았을 수 있습니다. 스레드를 구성 할 때 부모를 전달해야하지만 부모 인수가 필요하지 않으므로 TelnetConnection이 잘못되었거나 내부적으로 기본 클래스에 다음 생성자를 전달하는 것을 전달하지 않습니다. .

QThread(QObject * parent = 0) 

또는 나중에 setParent()를 호출해야합니다.

void QObject::setParent(QObject * parent) 

이것은 thread.setParent (this)를 의미합니다. 귀하의 코드,하지만 오히려 귀하의 스레드 클래스 생성자 또는 그것의 호출을 수정하는 것이 좋습니다 것이 좋습니다.

또한 TelnetConnection 명시 적으로 자식을 설정할 수도 있지만 가능한 경우 적절한 구성을 제안합니다.

+0

그건 그렇고 - 나는 생성자의 초기화 라인에 부모를 설정해야했고 그 다음에는 볼 수있었습니다! – TSG