• Qt信号槽与多线程的关系


    分享一下今天我去面试,面试官给我抛出的一个问题:
    Qt信号槽与多线程的关系?

    我的回答:没有关系。

    他告诉我,是有关系的,Qt的信号槽是通过线程去操作顺序的,比如槽的第五个参数为队列,那么就是在槽函数不会在主线程。

    我说我记得我打印过线程id,都是在主线程,

    他说:不对的,你自己回去试试。

    于是我回来搜索了很多,没有发现网上相关的任何回答,搜到的大多是关于多线程中使用信号槽的问题。

    于是我做了如下实验:

    使用一个按钮,按钮点击的时候就是触发一次信号,这个信号触发的槽函数里面打印当前线程id,来判断是否会出现不同线程的情况。

    代码:
    .h文件:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include 
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    signals:
        void testSig();
    
    private slots:
        void slotClicked();
        void testSlot();
    
    private:
        Ui::MainWindow *ui;
    };
    #endif // MAINWINDOW_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    cpp

    #include "mainwindow.h"
    
    #include 
    #include 
    #include 
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        ui->setupUi(this);
        QPushButton *button =new QPushButton(this);
        connect(button,&QPushButton::clicked,this,&MainWindow::slotClicked);
    
        connect(this,&MainWindow::testSig,this,&MainWindow::testSlot,Qt::QueuedConnection);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::slotClicked()
    {
        qDebug()<<"发送前" <<QThread::currentThreadId();
        emit testSig();
    }
    
    void MainWindow::testSlot()
    {
         qDebug()<<"发送后" <<QThread::currentThreadId();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    不断的替换信号槽的第五个参数,打印都是和主线程的线程id相同
    在这里插入图片描述
    我寻思这是否作证了信号槽不是使用线程去控制的

    期待大佬们的出现,帮我想想到底怎么样的是正确的。

    目前我还是认为信号槽和线程没有关系。而信号槽是依赖于事件循环的。

  • 相关阅读:
    Altium格式PCB转换成Allegro操作指导
    pandas使用dropna函数删除dataframe数据中多个数据列的内容至少包含一个缺失值的数据行(使用subset参数指定多个数据列)
    基于web的医院预约挂号系统/医院管理系统
    用OCC+VS+Qt创建并显示一个几何
    【Arduino+ESP32专题】案例:使用INA3221监控电压电流 1
    火车旅客信息网上管理系统
    面试-Redis-缓存击穿
    网络工程师干货:华为设备故障管理命令大全
    ChatGPT的未来
    C# 计算两两坐标之间的距离(SIMD加速)
  • 原文地址:https://blog.csdn.net/qq_43081702/article/details/126167456