zoukankan      html  css  js  c++  java
  • 【QT】跨线程的信号槽(connect函数)

    线程的信号槽机制需要开启线程的事件循环机制,即调用QThread::exec()函数开启线程的事件循环。

    Qt信号-槽连接函数原型如下:

    bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection ) 
    

    Qt支持5种连接方式

    • Qt::DirectConnection(直连方式)(信号与槽函数关系类似于函数调用,同步执行)
      当信号发出后,相应的槽函数将立即被调用。emit语句后的代码将在所有槽函数执行完毕后被执行。当信号发射时,槽函数将直接被调用。无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行。
    • Qt::QueuedConnection(队列方式)(此时信号被塞到事件队列里,信号与槽函数关系类似于消息通信,异步执行)
      当信号发出后,排队到信号队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,调用相应的槽函数。emit语句后的代码将在发出信号后立即被执行,无需等待槽函数执行完毕。当控制权回到接收者所依附线程的事件循环时,槽函数被调用。槽函数在接收者所依附线程执行。
    • Qt::AutoConnection(自动方式) 
      Qt的默认连接方式,如果信号的发出和接收信号的对象同属一个线程,那个工作方式与直连方式相同;否则工作方式与队列方式相同。如果信号在接收者所依附的线程内发射,则等同于直接连接如果发射信号的线程和接受者所依附的线程不同,则等同于队列连接
    • Qt::BlockingQueuedConnection(信号和槽必须在不同的线程中,否则就产生死锁) 
      槽函数的调用情形和Queued Connection相同,不同的是当前的线程会阻塞住,直到槽函数返回。
    • Qt::UniqueConnection
      与默认工作方式相同,只是不能重复连接相同的信号和槽,因为如果重复连接就会导致一个信号发出,对应槽函数就会执行多次。

    如果没有特殊的要求我们connect函数选择默认的连接方式就好,也就是connect的第五个参数不填写就ok,例如:

    connect(m_obj, &QObject::destroyed, this, &MainWindow::SetPtrNullptr);
    
  • 相关阅读:
    iOS布局进化史
    thinkphp5.0 文章详情页 上一篇 下一篇
    Thinkphp 3.2中文章详情页的上一篇 下一篇文章功能
    WebSocket协议:5分钟从入门到精通
    Nginx实战之反向代理WebSocket的配置实例
    nginx服务器配置/websocket nginx 配置笔记
    使用nginx作为websocket的proxy server
    看完让你彻底搞懂Websocket原理
    本地phpstudy时常停机连接失败,php.ini文件中9000端口问题
    python 发邮件
  • 原文地址:https://www.cnblogs.com/lcgbk/p/13953566.html
Copyright © 2011-2022 走看看