Qt可以通过继承QThread来实现线程的创建。
broadcastthread.h
/*******************************************************************/// Content :开辟次线程
// Update record:
// Date Author Comments
// ---------- ------------ -------------------------------
/*******************************************************************/#ifndef BROADCASTTHREAD_H
#define BROADCASTTHREAD_H
#include "qthread.h"
/*******************************************************************/// Function :开辟次线程发送UDP报文和监听tcp连接
/*******************************************************************/class BroadcastThread : public QThread
{Q_OBJECT
public:BroadcastThread();
~BroadcastThread();
private:/*******************************************************************/
// Function :获取本机IP地址
// Parameters :localHost:本机计算机名
// Return :ipAddr:本机IP地址
/*******************************************************************/
QString getIP(QString localHost);
signals:/*******************************************************************/
// Function :触发开始监听信号
// Parameters :address:监听的IP地址
// Return :
/*******************************************************************/
void startlisten(QString address);
/*******************************************************************/
// Function :触发停止监听信号
// Parameters :
// Return :
/*******************************************************************/
void stoplisten();
protected:/*******************************************************************/
// Function :获取本机IP地址并发送UDP报文和监听tcp连接
// Parameters :
// Return :
/*******************************************************************/
void run();
};
#endif // BROADCASTTHREAD_H
broadcastthread.cpp
#include "broadcastthread.h"
#include "asdu_define.h"
#include "commmodule.h"
#include "qhostaddress.h"
#include "qhostinfo.h"
#include "qnetworkinterface.h"
#include "dbmodule.h"
BroadcastThread::BroadcastThread(): QThread()
{}
BroadcastThread::~BroadcastThread()
{}
/*******************************************************************/// Function :获取本机IP地址
// Parameters :localHost:本机计算机名
// Return :ipAddr:本机IP地址
/*******************************************************************/QString BroadcastThread::getIP(QString localHost)
{QString ipAddr;
QHostInfo info = QHostInfo::fromName(localHost);
info.addresses();//QHostInfo的address函数获取本机ip地址
//如果存在多条ip地址ipv4和ipv6:
foreach(QHostAddress address,info.addresses())
{if(address.protocol()==QAbstractSocket::IPv4Protocol){//只取ipv4协议的地址
// qDebug()<<address.toString();
ipAddr = address.toString();
} }return ipAddr;
}
/*******************************************************************/// Function :获取本机IP地址并发送UDP报文和监听tcp连接
// Parameters :
// Return :
/*******************************************************************/void BroadcastThread::run()
{CommInterface * cm = CommModule::GetInterface();
QByteArray socket_info;
QString localHost,localAddress,lastAddress;
localHost = QHostInfo::localHostName();
localAddress = getIP(localHost);
lastAddress = localAddress;
emit startlisten(localAddress);
while(1)
{ socket_info.clear();localHost = QHostInfo::localHostName();
if(Temp::g_hostaddress=="")
{localAddress = getIP(localHost);
}else
{localAddress = Temp::g_hostaddress;
}QStringList iplist = localAddress.split(".");
if(iplist.count()!=4)
return;
QString ip1 = iplist.at(0);
QString ip2 = iplist.at(1);
QString ip3 = iplist.at(2);
QString ip4 = iplist.at(3);
quint8 type= 0;
socket_info.append(char(LSB(type)));
socket_info.append(char(LSB(type)));
socket_info.append(char(LSB(type)));
socket_info.append(char(LSB(type)));
socket_info.append(KUdpSetIP);
socket_info.append(ip1.toInt()); socket_info.append(ip2.toInt()); socket_info.append(ip3.toInt()); socket_info.append(ip4.toInt());cm->DealUIOrder(socket_info);
if(lastAddress != localAddress)
{emit stoplisten();
QThread::msleep(1000);
emit startlisten(localAddress);
}lastAddress = localAddress;
QThread::msleep(5000);
}}
其中
Temp::g_hostaddress为全局变量,如果全局变量为空,则广播自动获取的IP地址,如果不为空,则广播全局变量中的IP地址。
本文介绍了一种基于Qt框架的线程实现方法,通过继承QThread类来创建线程,用于发送UDP报文和监听TCP连接。同时,文中详细展示了如何在该线程中获取本机IP地址,并使用这些IP地址进行网络通信。
640

被折叠的 条评论
为什么被折叠?



