0

我创建了一个(有点)简单的 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() 插槽。但是,telnet 服务器的 findchildren 显示我的(刚刚断开的)会话的 QThread 对象仍然存在。就好像完成的信号没有发出。

作为一项实验,我将完成的信号与 Qdebug 的“FINISHED”函数联系起来......它永远不会出现。有人可以解释为什么在我断开 telnet 客户端后没有发出完成的信号吗?


我假设调用 thread.disconnectClient() 会终止线程......但也许这是一个不正确的假设?我必须退出线程的 exec 循环吗?

4

1 回答 1

1

如果你断开一个正在运行的线程,并且你没有得到适当的处理,finished信号不应该被调用,所以这是正常的。

您可以稍后连接删除或您建立的断开“信号”,但您需要确保正确退出线程。

于 2013-10-05T05:00:10.177 回答