zoukankan      html  css  js  c++  java
  • 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多线程中的信号-槽
  • 相关阅读:
    location.href使用方法总结
    Ubuntu 12.04 安装JDK 8和Eclipse
    【一】仿微信飞机大战cocos2d-x3.0rc1
    QTP的基本功能介绍
    Spring+Ibatis集成开发实例
    Java NIO与IO的差别和比較
    嵌入式Linux常见问题
    递归和迭代之间的差
    大约sources.list和apt-get [转载]
    JVM学习笔记(一)------的基本结构
  • 原文地址:https://www.cnblogs.com/hugochen1024/p/12570767.html
Copyright © 2011-2022 走看看