QThread QTcpSocket не испускает готовый сигнал

Я создал (несколько) простой telnet-сервер, который создает новый поток для каждого соединения:

void TelnetServer::incomingConnection(qintptr socketDescriptor)
{
    TelnetConnection *thread = new TelnetConnection(socketDescriptor, this);
    connect(thread, SIGNAL(shutdownRequested()), m_controller, SLOT(shutdown()));
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();
}

После отключения клиента telnet я ожидал вызова слота deleteLater(). Однако findchildren сервера telnet показывает, что мой объект QThread для (только что отключенного) сеанса все еще существует. Это как если бы готовый сигнал не излучался.

В качестве эксперимента я привязал готовый сигнал к функции, которую Qdebug "ЗАВЕРШИЛ"... и она никогда не появляется. Может ли кто-нибудь объяснить, почему готовый сигнал не излучается после отключения клиента telnet?


Я предполагаю, что вызов thread.disconnectClient() завершает поток... но, возможно, это неверное предположение? Мне нужно выйти из цикла выполнения для потока?


person TSG    schedule 05.10.2013    source источник
comment
Finished() срабатывает сразу после завершения run(). Если run() никогда не возвращается, вы не можете ожидать, что сработает Finish(). См. соответствующую документацию здесь: http://qt-project.org/doc/qt-5.0/qtcore/qthread.html#finished   -  person Alex Reinking    schedule 05.10.2013


Ответы (1)


Если вы отключите запущенный поток, и у вас не будет надлежащего лечения, готовый сигнал не должен вызываться, так что это нормально.

Вы можете подключить удаление позже или «сигнал» отключения, который вы устанавливаете, но вам нужно убедиться, что вы правильно вышли из потока.

person lpapp    schedule 05.10.2013
comment
Чтобы правильно выйти из потока, я просто вызываю QThread::quit() ? Если это так, я добавлю его в свой отключенный слот для этой темы. - person TSG; 05.10.2013
comment
Я вызываю tcpSocketPtr-›disconnectFromHost(); чтобы инициировать отключение на стороне сервера. Затем вызывается слот clientdisconnected(), так как я привязал его к отключенному сигналу QTcpSocket. Значит, последняя строка clientdisconnected() должна быть QThread::quit()? - person TSG; 05.10.2013
comment
@ Мишель: ты нашел ответ на свой вопрос? - person lpapp; 16.11.2013
comment
Да - я позволяю потоку отключиться и закрыться, а затем удалить его после того, как он не используется. - person TSG; 17.11.2013