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地址。