• QT踩坑记录1-多线程信号与槽


    QT踩坑记录1-多线程信号与槽

    错误输出

    无错误输出, 但是声明了信号的连接,但是无法使用 程序中就是无命令

    介绍

    QT 典型程序

    #include <QObject>
    class MyClass:public QObject
    {
        Q_OBJECT
    signals:
        void signals_dosomething(int n);
    
    public slots:
        void slots_dosomething(int n)
        {
            m_value_ = n;
        }
    private:
        int m_value_;
    public:
        MyClass(QObjet *parent = nullptr)
            :QObject(parent),
             m_value_(0)
        {
            QObject::connect(this,
                            &MyClass::signals_dosomething,
                            this,
                            &MyClass::slots_dosomething,
                            Qt::DirectConnection);
            
        }    
    }

    解决

    手动指定连接方式

    connect(sender, signal, receiver, slot);
    其实,connect还有一个Qt::ConnectionType参数,只是它带有默认值,且多数情况下,默认值足够了,所以最少有机会去了解。Qt::ConnectionType的可选值如下:

    Qt::AutoConnection:
    默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection。

    Qt::DirectConnection: 槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用了槽函数。这个在多线程环境下比较危险,可能会造成奔溃。

    Qt::QueuedConnection: 槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个。

            QObject::connect(this,
                            &MyClass::signals_dosomething,
                            this,
                            &MyClass::slots_dosomething,
                            Qt::DirectConnection);

    更多

    参考链接

    1. Qt多线程中的信号-槽
  • 相关阅读:
    Ztree下拉框多选
    FullCalendar日程插件
    viscose 前端常用插件
    一些词
    关于require()和export引入依赖的区别
    关于CMD/AMD和Common.js/Sea.js/Require.js
    vue中的双向数据绑定原理简单理解
    Vue-cli简单使用
    webpack简单配置
    vuex基础
  • 原文地址:https://www.cnblogs.com/hugochen1024/p/12570767.html
Copyright © 2020-2023  润新知