exec
- exec()属线程的事件处理机制,当继承时,没有重新run();
则:
variety run()
{
exec()
}
1、exec();的退出要通过exit(int ),或quit(),注quit() = exit(0);
2、在exec()之前调用exit(int )----有效
3、其它线程可通过信号,并通过槽实现exit(int);
动态申请线程和资源的处理
1、定义
class HK_R_Version_CMD :public QThread
{
public:
//输入数据
struct dataIn
{
int port; //摄像头端口
QString IP;//摄像头
};
//输出结果
struct dataOut
{
int res; //0:无应答
//1:正确
//2:网络开启错误
//3:输入数据格式错误
unsigned char data[12];//数据
};
public:
explicit HK_R_Version_CMD()
{
m_toStop = false;
}
~HK_R_Version_CMD();
int setDataIn(struct dataIn *dataIn);
int readDataOut(struct dataOut*dataOut);
void stop()
{
m_toStop = true;
}
protected:
int m_port; //摄像头端口
QString m_IP;//摄像头
QUdpSocket *m_udpSocket;
struct dataIn m_dataInTempStr; //启动线程时
struct dataOut m_dataOutTempStr; //输出结果
volatile bool m_toStop;
void run();
};
2、线程实现
HK_R_Version_CMD::~HK_R_Version_CMD()
{
}
int HK_R_Version_CMD::setDataIn(HK_R_Version_CMD::dataIn *dataIn)
{
m_dataInTempStr.IP = dataIn->IP;
m_dataInTempStr.port = dataIn->port;
//ToolFunc::charArrCopy(m_dataInTempStr.dataIn ,dataIn, );
return 0;
}
int HK_R_Version_CMD::readDataOut(HK_R_Version_CMD::dataOut *dataOut)
{
dataOut->res = m_dataOutTempStr.res;
ToolFunc::charArrCopy(dataOut->data ,m_dataOutTempStr.data,12);
return 0;
}
void HK_R_Version_CMD::run()
{
m_dataOutTempStr.res = 0;
m_IP = m_dataInTempStr.IP;
m_port = m_dataInTempStr.port;
//创建通讯接口
m_udpSocket = new QUdpSocket();
//信号与槽
bool result = m_udpSocket->bind(13801);
//qDebug()<<"result = "<<result;
if(!result)
{
//QMessageBox::information(this,"error","udp socket create error!");
m_dataOutTempStr.res = 2;//网络出错
delete m_udpSocket;
return;
}
//发送数据
struct HK_TXDData TXDDataTemp;
TXDDataTemp.command = 0x01;
TXDDataTemp.state = 0x00;
TXDDataTemp.length = 0;
unsigned char *TXDDataBuff = new unsigned char[TXDDataTemp.length+6];
int TxdLength = HK_TXDDataCreat(&TXDDataTemp,TXDDataBuff);
if(TxdLength ==-1)
{
//QMessageBox::warning(this,"error","format error",QMessageBox::Ok);
m_dataOutTempStr.res = 3;//指令格式错误
delete[] TXDDataBuff;
delete m_udpSocket;
return;
}
QByteArray txdBuff;
txdBuff.resize(TxdLength);
ToolFunc::charArrToByteArrayCopy(txdBuff,TXDDataBuff,TxdLength);
int RXDtimeCount;//计时
int tryCount = 3;//重试
int breakMark = 1;
struct HK_RXDData* RXDCommand = new struct HK_RXDData;
unsigned char* rxdbuff = new unsigned char[600];
while(breakMark==1)
{
//发送数据
m_udpSocket->writeDatagram(txdBuff,QHostAddress(m_IP),m_port);
// qDebug()<<"txd:"<<ToolFunc::hexToString(TXDDataBuff,TxdLength);
RXDtimeCount = 20;
//接收处理
while(RXDtimeCount!=0)
{
if(m_udpSocket->hasPendingDatagrams())
{
QByteArray datagram;
int length;
datagram.resize(m_udpSocket->pendingDatagramSize());
length = m_udpSocket->readDatagram(datagram.data(),600);
ToolFunc::ByteArrayTocharArrCopy(rxdbuff,datagram,length);
//判定协议========================
//数据包校对
// qDebug()<<"rxd:length = "<<length;
// qDebug()<<"txd:"<<ToolFunc::hexToString(rxdbuff,length);
HK_RXDDataCreat(rxdbuff,length,RXDCommand);
// qDebug()<<"RXDCommand->b_vail =" <<RXDCommand->b_vail;
// qDebug()<<"RXDCommand->command =" <<RXDCommand->command;
// qDebug()<<"RXDCommand->length =" <<RXDCommand->length;
// qDebug()<<"RXDCommand->state =" <<RXDCommand->state;
if(RXDCommand->b_vail == false)
{
break;
}
//协议
if(RXDCommand->command != 0x81)
{
break;
}
//数据长度
if(RXDCommand->length!= 12)
{
break;
}
ToolFunc::charArrCopy(m_dataOutTempStr.data,RXDCommand->data,RXDCommand->length);
m_dataOutTempStr.res = 1;
breakMark = 0;
break;
}
else
{
msleep(5);
RXDtimeCount-- ;
}
}
if(m_dataOutTempStr.res != 0)
{
breakMark = 0;
}
else
{
tryCount--;
if(tryCount == 0)
{
m_dataOutTempStr.res = 0;
breakMark = 0;
}
}
}
delete RXDCommand;
delete[] rxdbuff;
delete[] TXDDataBuff;
delete m_udpSocket;
}
3、创建线程
void DetetionCameraHKWSWin::readVersion_Btn_clicked()
{
clearRXDDatatDis();
waitingWinDlg = new WaitingWin(this,"",0);
waitingWinDlg->show();
m_tHK_R_Version_CMD = new HK_R_Version_CMD;
struct HK_R_Version_CMD::dataIn dataInTtemp;
dataInTtemp.IP = ui->IP_Edit->text();
dataInTtemp.port = ui->Port_Edit->text().toInt();
m_tHK_R_Version_CMD->setDataIn(&dataInTtemp);
connect(m_tHK_R_Version_CMD,SIGNAL(finished()),this,SLOT(tHK_R_Version_CMD_Manage()));
m_tHK_R_Version_CMD->start();
return;
}
3、线程结束处理(ui线程中处理)
void DetetionCameraHKWSWin::tHK_R_Version_CMD_Manage()
{
//关闭处理界面
waitingWinDlg->close();
//读取处理结果数据==============================
struct HK_R_Version_CMD::dataOut dataOutTtemp;
m_tHK_R_Version_CMD->readDataOut(&dataOutTtemp);
QString stateStr;
if(dataOutTtemp.res == 0)
{
stateStr = "通讯失败" ;
}
else if(dataOutTtemp.res == 1)
{
stateStr = "通讯成功" ;
}
else if(dataOutTtemp.res == 2)
{
stateStr = "网络打开失败" ;
}
else
{
stateStr = "输入数错误" ;
}
ui->RXDStateEdit->setText(stateStr);
if(dataOutTtemp.res == 1)
{
QString str;
stateStr = QString("版本号: 0x%1").arg(dataOutTtemp.data[0],2,16,QLatin1Char('0'));
stateStr.append("\r\n");
if(dataOutTtemp.data[1]&0x01)
{
str=QString("车牌识别: %1").arg("支持") ;
}
else
{
str=QString("车牌识别: %1").arg("不支持");
}
stateStr.append(str);
stateStr.append("\r\n");
ui->RxdtEdit->setText(stateStr);
}
//===========================================
//关闭处理线程
m_tHK_R_Version_CMD->disconnect();
delete m_tHK_R_Version_CMD;
m_tHK_R_Version_CMD = NULL;
//显示结果====================================
//============================================
}