【问题标题】:QTcpSocket's QThread not emitting finished signalQTcpSocket 的 QThread 未发出完成信号
【发布时间】:2013-10-05 04:45:45
【问题描述】:

我创建了一个(有点)简单的 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 循环吗?

【问题讨论】:

标签: c++ qt qtcore qt-signals qtnetwork


【解决方案1】:

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

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

【讨论】:

  • 要正确退出线程,我只需调用 QThread::quit() 吗?如果是这样,我会将它添加到该线程的断开连接的插槽中。
  • 我调用 tcpSocketPtr->disconnectFromHost();启动服务器端断开连接。然后调用 slot clientdisconnected(),因为我将它绑定到 QTcpSocket 的断开信号。那么clientdisconnected()的最后一行应该是QThread::quit()呢?
  • @Michelle:你找到问题的答案了吗?
  • 是的 - 我让线程断开并关闭,然后在不再使用后删除。