先贴上代码
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还是会挂。