QT开发中文网

// m_handleThreadHash[socketDescriptor]->quit(); // m_handleThreadHash[socketDescriptor]->wait(); 这两句 会导致程序闪退 在断开客户端连接的时候

在处理连接断开时,直接调用线程的quit()和wait()方法可能会导致程序闪退。这是因为quit()方法会终止线程的事件循环,而wait()方法会阻塞当前线程直到目标线程退出。

推荐使用QObject::deleteLater()来延迟删除socket对象,并通过信号与槽机制或者QMetaObject::invokeMethod进行跨线程调用。例如:

// Socket类的槽函数,在连接断开时被触发
void Socket::onDisconnected()
{
    // 延迟删除socket对象,确保在事件循环结束后删除
    deleteLater();

    // 发送一个信号通知所属的线程进行处理
    emit disconnectSignal();
}

然后,在你的QTcpServer子类中,连接Socket类的disconnectSignal信号,并在相应的槽函数中处理断开连接的逻辑。

// QTcpServer子类中重写incomingConnection方法
void MyTcpServer::incomingConnection(qintptr socketDescriptor)
{
    // 创建Socket对象,并将其移入新线程
    Socket* socket = new Socket(this);
    QThread* thread = new QThread(this);
    socket->moveToThread(thread);

    // 连接断开信号与槽函数进行处理
    connect(socket, &Socket::disconnectSignal, this, &MyTcpServer::handleDisconnect);

    // 其他逻辑...

    thread->start();
}

// 处理断开连接的槽函数
void MyTcpServer::handleDisconnect()
{
    Socket* socket = qobject_cast<Socket*>(sender());
    if (socket)
    {
        // 其他处理逻辑...

        // 延迟删除socket对象
        socket->deleteLater();
    }
}

通过上述方式,你可以安全地处理连接断开时的操作,而不会导致程序崩溃。同时,确保在移动对象到新线程之前正确调用QObject::moveToThread()。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=9560

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?