0

ソケットへの接続ごとに 1 つの新しいスレッドを作成する (やや) 単純なプログラムがあります。

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

子スレッドが表示されないのはなぜですか? これは、スレッドが親オブジェクトに関連付けられなくなったことを意味しますか? それとも、ここで何か間違ったことをしていますか...

4

1 に答える 1

1

これは、スレッドが親オブジェクトに関連付けられなくなったことを意味しますか?

関連付けられたことがない可能性があります。スレッドを構築するときは、それに親を渡す必要がありますがTelnetConnection、親の引数を期待していないか、次のコンストラクターを使用して基本クラスに内部的に渡すものを渡していないため、間違っているようです。

QThread(QObject * parent = 0)

または、後で setParent() を呼び出す必要があります。

void QObject::setParent(QObject * parent)

これは、thread.setParent(this); を意味します。ただし、スレッド クラス コンストラクターまたはその呼び出しのいずれかを修正することをお勧めします。

または、TelnetConnection の子を明示的に設定することもできますが、可能であれば適切な構成をお勧めします。

于 2013-10-05T04:20:40.120 に答える