Gary_Cui_1st 2015-11-04 02:39 采纳率: 0%
浏览 2723

Qt多线程TCP编程会挂掉

先贴上代码

 void FortuneWriteThread::run()
{
    QTcpSocket tcpSocket;
    if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
        LogManagerInst << LogManager::LogDegreeType_Error << "Socket " << QString::number(socketDescriptor) << " : " << tcpSocket.errorString();
        emit error(tcpSocket.error());
        return;
    }

    tcpSocket.moveToThread(this);

    while( !m_quit && tcpSocket.state() == QAbstractSocket::ConnectedState ) {
        m_mutex.lock();
        if(m_replyList.count() == 0)
            m_replyEmptyCond.wait(&m_mutex);
        m_mutex.unlock();

 //       QByteArray head;
//        QByteArray block;

        // data to write
        while(m_replyList.count()) {
            QByteArray block = m_replyList.takeFirst();
            if(block.length() && (block.length() <= 9999)) {
                QByteArray head = "0000";
                head.append(QString::number(block.length()));
                head = head.right(4);
                block.prepend(head);
                tcpSocket.write(block);
                tcpSocket.flush();
            }
        }
    }
}

挂掉点1、当我把注释掉的
// QByteArray head;
// QByteArray block;
放开后,而把下面的head,block申明去掉后,会在
block = m_replyList.takeFirst();
这里挂掉,debug出的结果是block不可访问

挂掉点2

程序有时候会在tcpSocket.write(block);挂掉,debug不出挂掉的原因
我在if(block.length() && (block.length() <= 9999))下面的大括号里加上lock还是会挂。

  • 写回答

1条回答 默认 最新

  • HardessGod 2018-06-21 06:59
    关注

    挂掉点1:涉及到线程间资源访问的知知识,你虽然把线程move了,也就是你子线程要去访问你主线程中创建的变量了

    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘