• 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相同
    在这里插入图片描述
    我寻思这是否作证了信号槽不是使用线程去控制的

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

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

  • 相关阅读:
    JAVA:实现Disjoint Sets不相交集合算法(附完整源码)
    【计算机网络笔记】TCP的拥塞控制机制
    CV学习笔记-BP神经网络代码Python实例
    论文阅读:Deep-Learning Super-Resolution Microscopy
    国赛高教杯使用python/matlab必会算法数学建模-回归分析模块(课程6)
    详解Jmeter中的BeanShell脚本
    乘法逆元、模运算
    Idea debug失败,但是run可以正常
    深度剖析图像处理—边缘检测
    附录一-pandas操作excel
  • 原文地址:https://blog.csdn.net/qq_43081702/article/details/126167456