码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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相同
    在这里插入图片描述
    我寻思这是否作证了信号槽不是使用线程去控制的

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

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

  • 相关阅读:
    《HelloGitHub》第 75 期
    leetcode - 1887. Reduction Operations to Make the Array Elements Equal
    软件工程——名词解释
    18.示例程序(编码器接口测速)
    ubuntu下yolov5 tensorrt模型部署
    JavaScript系列从入门到精通系列第七篇:JavaScrip当中的运算符,主要涉及JavaScript当中的六大数据类型的四则运算
    优秀测试成长之路
    路由、 网络、互联网、因特网、公网私网IP、NAT技术
    el-tree 获取当前勾选节点的选中状态以及选中值对象 触发check-change多次事件问题原因
    没有基础适合学习java吗?
  • 原文地址:https://blog.csdn.net/qq_43081702/article/details/126167456
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号