卑鄙的张老二 2023-10-25 10:28 采纳率: 0%
浏览 18

Qt的主线程控件控制子线程的槽函数使用了QueuedConnection处理模式,主线程闲置没有执行槽函数


#include "Radar.h"
#include "ui_Radar.h"

Radar::Radar(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::Radar)
{
    ui->setupUi(this);

    try {
         m_radar = new Radar_RW();
         m_radar->moveToThread(new QThread());

    } catch (std::bad_alloc &e) {
        qDebug()<<"omg!!";
    }
       QObject::connect(m_radar,&Radar_RW::dataReceived,this,&Radar::ondataReceived);
       m_radar->start();
       try {
           QObject::connect(ui->Come_Tiltration,SIGNAL(clicked()),m_radar,SLOT(ComeTiltration_setting()),Qt::QueuedConnection);
       } catch (std::exception &e) {
           qDebug()<<"Oh,shit!";
       }


   Dialog_Init();

}

Radar::~Radar()
{
    m_radar->quit();
    delete ui;
}



#include "Radar_RW.h"

Radar_RW::Radar_RW(QObject *parent):
    QThread(parent),
    m_ReceiveThreadFlag(true)
{
    m_serialPort_Infos = QSerialPortInfo::availablePorts();
    qDebug() << "Available serial ports:";
    for (const QSerialPortInfo &serialPortInfo : m_serialPort_Infos) {
        qDebug() <<serialPortInfo.portName();
    }
    // 打开串口
    m_serialPort.setPortName(m_serialPort_Infos.first().portName()); // 设置串口名
    m_serialPort.setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);  // 设置波特率
    m_serialPort.setDataBits(QSerialPort::Data8);  // 设置数据位
    m_serialPort.setParity(QSerialPort::NoParity);  // 设置校验位
    m_serialPort.setStopBits(QSerialPort::OneStop);  // 设置停止位
    if (!m_serialPort.open(QIODevice::ReadWrite)) {
        qDebug() << "Failed to open serial port!"<<m_serialPort.errorString();

    }
    else{
        qDebug()<<"success!";
        }

}

void Radar_RW::run()
{
    while (m_ReceiveThreadFlag){       
        try {
            // 等待接收数据
             m_serialPort.waitForReadyRead(1000);
            // 读取数据
            QByteArray responseData = m_serialPort.readAll();
            m_data=responseData.toHex();
            if(!m_data.isEmpty())
            {
            qDebug()<<m_data;
            }
            emit dataReceived(m_data);
        } catch (std::exception &e) {
           qDebug()<<"sorry!";
        }


    }
}

void Radar_RW::Receive()
{
    // 等待接收数据
    QString Data;
    QByteArray responseData;
    while (true) {
        if (m_serialPort.waitForReadyRead(1000)) {
                responseData = m_serialPort.readAll();
                 QString hexString = QString(responseData.toHex());
                 qDebug()<<hexString;
                if (hexString.startsWith("fa323030fb")) {
                    QString subString = hexString.mid(0, 10);
                    Data.append(subString);
                    }
                if (Data == "fa323030fb") {
                     qDebug() << "SET_Success";
                    break;
                    }
            }
    }

    Data.truncate(0);
}

void Radar_RW::Enter_setting()
{
    m_ReceiveThreadFlag=false;
    // 发送控制指令
    QByteArray sendData;
    sendData.append(0xFA);
    sendData.append(0x31);
    sendData.append(0x30);
    sendData.append(0x30);
    sendData.append(0xFB);
    qint64 bytesWritten = m_serialPort.write(sendData);
    if (bytesWritten == -1) {
        qDebug() << "Failed to send control command!";
        m_serialPort.close();
    }
}

void Radar_RW::Exit_setting()
{
    // 发送控制指令
    QByteArray sendData;
    sendData.append(0xFA);
    sendData.append(0x32);
    sendData.append(0x30);
    sendData.append(0x30);
    sendData.append(0xFB);
    qint64 bytesWritten = m_serialPort.write(sendData);
    if (bytesWritten == -1) {
        qDebug() << "Failed to send control command!";
        m_serialPort.close();
    }
     m_ReceiveThreadFlag=true;
}

void Radar_RW::ComeTiltration_setting()
{
    Enter_setting();
    // 发送控制指令1  触头
    QByteArray sendData1;
    sendData1.append(0xFA);
    sendData1.append(0x33);
    sendData1.append(0x31);
    sendData1.append(0x30);
    sendData1.append(0xFB);
    qint64 bytesWritten1 = m_serialPort.write(sendData1);
    if (bytesWritten1 == -1) {
        qDebug() << "Failed to send control command!";
        m_serialPort.close();
    }
    // 发送控制指令2  来向
    QByteArray sendData;
    sendData.append(0xFA);
    sendData.append(0x37);
    sendData.append(0x31);
    sendData.append(0x30);
    sendData.append(0xFB);
    qint64 bytesWritten2 = m_serialPort.write(sendData);
    if (bytesWritten2 == -1) {
        qDebug() << "Failed to send control command!";
        m_serialPort.close();
    }
    Receive();
    Exit_setting();
}

请问主线程的第二个connect()函数信号发送过去之后主线程是闲置的为什么没有执行槽函数呢?
希望能解答一下,不胜感激

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-25 12:15
    关注

    【以下回答由 GPT 生成】

    这段代码存在一个问题:主线程闲置没有执行槽函数。原因是在连接信号和槽函数时使用了Qt::QueuedConnection处理模式,这会导致槽函数在主线程中排队等待执行,如果主线程闲置,槽函数就不会被执行。

    为了解决这个问题,我们可以使用以下方法进行优化:

    1. 在子线程对象创建之前,将子线程对象移到主线程中。这样可以保证子线程的事件循环运行在主线程中。
    m_radar = new Radar_RW();
    
    QThread* workerThread = new QThread();
    m_radar->moveToThread(workerThread);
    
    QObject::connect(workerThread, &QThread::finished, m_radar, &QObject::deleteLater);
    workerThread->start();
    
    1. 将槽函数的连接方式改为Qt::AutoConnection。这样Qt会根据信号和槽函数所处的线程自动选择连接方式,如果在同一个线程,则直接执行槽函数,如果在不同线程,则使用Qt::QueuedConnection连接方式。
    QObject::connect(ui->Come_Tiltration, SIGNAL(clicked()), m_radar, SLOT(ComeTiltration_setting()), Qt::AutoConnection);
    

    优化后的代码如下所示:

    Radar::Radar(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::Radar)
    {
        ui->setupUi(this);
    
        try {
             m_radar = new Radar_RW();
    
             QThread* workerThread = new QThread();
             m_radar->moveToThread(workerThread);
    
             QObject::connect(workerThread, &QThread::finished, m_radar, &QObject::deleteLater);
             workerThread->start();
    
        } catch (std::bad_alloc &e) {
            qDebug() << "omg!!";
        }
    
        QObject::connect(ui->Come_Tiltration, SIGNAL(clicked()), m_radar, SLOT(ComeTiltration_setting()), Qt::AutoConnection);
    
        Dialog_Init();
    }
    

    请注意,优化后的代码根据问题描述需要调整功能实现,以确保在调用m_radar->start()之前,子线程已经启动并处于运行状态。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月25日