最近在编写基于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);
}
欢迎借鉴和指正