
void DataUnpacket::run( )
{
m_pSocket = new QTcpSocket
//m_pSocket->socketOption(QAbstractSocket::LowDelayOption)
QString ip("192.168.112.100")
ushort portData = 5001
m_pSocket->connectToHost( ip, portData )
m_pSocket->waitForConnected()
if( QAbstractSocket::ConnectedState != m_pSocket->state() )//判断是否连接成功
return
while( m_bRunning )
{
if( m_pSocket->bytesAvailable() >0)
{
QByteArray arr = m_pSocket->readAll()//这不进,
qDebug() <<"recv len =" <<arr.length()
}
else
{
m_pSocket->write("test",4)
m_pSocket->flush()// 可以发送出去
QThread::usleep(1000)
}
}
}
方法二 movethred 效果 一样
方法三 SocketQThread中使用 QtConcurrent::run创建线程, 这个使用QTCreater 调试没有问题,这个也是大坑
打包会出现不能接收到数据或者没发出去, wireshark检测有时会出现现象接收到数据但没发出去
int SocketQThread::InitTest( )
{
int re = 0
QString ip("192.168.112.5")
ushort portData = 5001
m_pDataPackage.resize(1)
m_pDataPackage[0] = new DataUnpacket
if( !m_pDataPackage[0]->InitSocket(ip,portData ) )
re = -1
return re
}
void SocketQThread::stratThred()
{
m_running = true
for(int i=0i<1i++)//测试
{
QtConcurrent::run(this, &SocketQThread::recvDataThread, i )
}
}
void SocketQThread::stopThred()
{
m_running = false
for(int i=0i<1i++)//测试
{
m_pDataPackage[0]->CloseFile( )
m_pDataPackage[0]->tcpDisconnect( )
}
}
void SocketQThread::recvDataThread( int ch )//暂定
{
DataUnpacket* pPackage = m_pDataPackage[ch]
while( m_running )
{
if( pPackage->SocketBytesAvailable() >0)
pPackage->RecvData()
else
QThread::usleep(1)
}
}
类DataUnpacket 继承 Cpackage 如下:
m_Socket为Cpackage的成员变量
int DataUnpacket::RecvData( )
{
int re = 0
QByteArray reArr
QByteArray arr = m_Socket.readAll()
qDebug() <<"recv len =" <<arr.length()
#if 0
m_Socket.write(arr )
m_Socket.flush()//不加发不出去
#else
QMetaObject::invokeMethod( &m_Socket, std::bind( static_cast<qint64(QTcpSocket::*)(const QByteArray &) >( &QTcpSocket::write ),&m_Socket, arr ))//, Qt::DirectConnection
//若加 Qt::DirectConnection ,需要添加m_Socket.flush()/
return re
}
bool Cpackage::InitSocket(QString&ip, ushort&port )
{
bool tf = true
m_Socket.connectToHost( ip, port )
m_Socket.waitForConnected()
if( QAbstractSocket::ConnectedState != m_Socket.state() )//判断是否连接成功
tf = false
return tf
}
void Cpackage::tcpDisconnect( )
{
if( m_Socket.state() == QAbstractSocket::ConnectedState) //关闭时,确保与服务器断开连接
m_Socket.disconnectFromHost()
}
方法四 QtConcurrent::run(this, &DataUnpacket::RecvDataTest) 这个
void testData::RecvDataTest()
{
m_pSocket = new QTcpSocket(this)
//m_pSocket->socketOption(QAbstractSocket::LowDelayOption)
QString ip("192.168.112.100")
ushort portData = 5001
m_pSocket->connectToHost( ip, portData )
m_pSocket->waitForConnected()
if( QAbstractSocket::ConnectedState != m_pSocket->state() )//判断是否连接成功
return
while( m_bRunning )
{
if( m_pSocket->bytesAvailable() >0)
{
QByteArray arr = m_pSocket->readAll()//这不进,
qDebug() <<"recv len =" <<arr.length()
}
else
{
m_pSocket->write("test",4)
m_pSocket->flush()//可以发送出去
QThread::usleep(1000)
}
}
}
如下例子 是可以的
void testData::RecvDataTest()
{
qDebug() <<QThread::currentThread()
QByteArray arr = m_pSocket->readAll()//这不进,
qDebug() <<"recv len =" <<arr.length()
m_pSocket->write("test",4)
}
void testData::stratThred( bool tf )
{
if( tf )
start()
else
exit()
}
void testData::run( )
{
qDebug() <<"stratThred" <<QThread::currentThread()
if( nullptr == m_pSocket )
{
m_pSocket = new QTcpSocket
connect(m_pSocket, SIGNAL(readyRead()), this, SLOT(RecvDataTest()), Qt::DirectConnection)
//m_pSocket->socketOption(QAbstractSocket::LowDelayOption)
}
m_pSocket->connectToHost( QString("192.168.112.100"), 5001 )
m_pSocket->waitForConnected()
if( QAbstractSocket::ConnectedState != m_pSocket->state() )//判断是否连接成功
return
//m_pSocket->waitForReadyRead(1000)
exec()
m_pSocket->disconnectFromHost()
}
F libc : Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x8 in tid 18493 (QThread), pid 18454 (project.example)或者是
ASSERT: “m_buf” in file
这两个错误
是因为socket 在write的时候, 调用线程和socket创建的线程不一致产生的崩溃
有两种情况
在其他线程调用了write函数,需要通过信号跳转到socket创建的线程调用write(connect信号时添加Qt::QueuedConnection参数),例如:
QObject::connect(this, static_cast<void (Socket::*)(const QByteArray &)>(&Socket::write),
this, [=](const QByteArray &byte){
if( socket->state() == QTcpSocket::ConnectedState ) {
socket->write(byte.data(), byte.size())
}
}, Qt::QueuedConnection)
复制
处理socket的disconnected信号重连时,QObject::connect需要添加Qt::QueuedConnection 参数
QObject::connect(socket, &QTcpSocket::disconnected, this, [=](){
socket->disconnectFromHost()
qDebug() <<"socket disconnect"
int time = 0
socket->connectToHost(deviceIP, cfg.port)
while (!socket->waitForConnected(50) &&!exit &&(time <20)) {
socket->connectToHost(cfg.ip, cfg.port)
time ++
}
if( socket->state() != QAbstractSocket::ConnectedState ) {
qDebug() <<"socket reconnect fail"
}
else {
qDebug() <<"socket reconnect success"
}
}, Qt::QueuedConnection)
复制
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)