Qt之线程补充

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;
    //显示结果====================================






    //============================================
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值