Qt 主线程中发射信号,想让槽函数运行在子线程中的方法

       最近在编写基于CAN通讯的BMS上位机,套的创芯科技的二次开发,在发送CAN指令中遇到了问题,在循环接收子线程传过来的接收到的can数据并解析到界面显示的过程中,点击发送”唤醒AFE芯片“can数据帧的时候,发现数据压根没传到下位机,并且界面卡死崩溃,于是想到多线程。

        Qt多线程包括创建线程类,继承QThread,重构run函数方法和继承QObject的movetoThread()方法,其中各自适用情况可以参考下链接转载:一文搞定之Qt多线程(QThread、moveToThread)

        因为我是通过信号和槽连接,在主线程发送信号,在CANConfig类里处理槽函数,所以我选择第二种。下面贴代码

1、在mainwindow.cpp中创建槽函数所在的类的对象和QThread的对象,并将其移入至新线程中。

//mainwindow.c

UICanConfig = new CANConfig();
    // 创建一个新的线程
    QThread *canConfigthread = new QThread;
    // 将UICanConfig对象移动到新线程
    canthread1 = new CANThread();

    // 将UICanConfig对象移动到新线程
    UICanConfig ->moveToThread(canConfigthread );

    // 连接UICanConfig对象的信号和槽
    // 该线程结束时销毁
    connect(canConfigthread, &QThread::finished, UICanConfig, &QObject::deleteLater);
    canConfigthread->start();

2、在mainwindow.cpp中编写点击发送MOS开闭的槽函数。

//闭合/断开充电MOS
void MainWindow::on_btn_ChargeMOS_clicked()
{
    emit signalChargeMOS(Date_chargeMOS);
}

3、在CANConfig.cpp文件中处理槽函数

void CANConfig::slotChargeMOS(QString str)
{
    QStringList strList = str.split(" ");
    char data1[64];
    memset(data1,0,64);
    for(int i = 0;i < strList.count();i ++)
    {
        data1[i] = strList.at(i).toInt(Q_NULLPTR,16);
    }
    char * data = data1;
    QString CANID = "0D70FFD1";
    UINT dlc = 8;
    UINT frameType = 1;
    UINT protocol = 0;
    UINT CANFDacc = 0;
    //8.发送接收数据
  canthread->sendData(CANID.toInt(Q_NULLPTR,16),frameType,protocol,CANFDacc,ui->sendPathCombo->currentIndex(),data,dlc);
}

 欢迎借鉴和指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洪泽湖湖主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值