使用方法1 继承QT thread 重写run
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=0;i<1;i++)//测试
{
QtConcurrent::run(this, &SocketQThread::recvDataThread, i );
}
}
void SocketQThread::stopThred()
{
m_running = false;
for(int i=0;i<1;i++)//测试
{
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();
}
温馨提示:答案为网友推荐,仅供参考