zoukankan      html  css  js  c++  java
  • Qt中的多线程通信

    1.Qt的UI线程中定义一个Qtimer,每个一段时间触发一个信号sig_A,这个sig_A与UI线程的槽函数slot_A相关联connect,但是并非每次emit sig_A都会触发slot_A,也就是说信号会丢失,为什么?

    本质上QTimer相当于创建了新的thread,Qt的线程间通过信号与槽通信需要明晰信号与槽的通信机制,什么是Qt::QueuedConnection,Qt::DirectionConnection, moveToThread()做了什么工作。

     

    Qt::AutoConnection

    自动连接:(默认值)如果信号在接收者所依附的线程内发射,则等同于直接连接。如果发射信号的线程和接受者所依附的线程不同,则等同于队列连接。

    Qt::DirectConnection

    直接连接:当信号发射时,槽函数将直接被调用。无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行。

    Qt::QueuedConnection

    队列连接:当控制权回到接受者所依附线程的事件循环时,槽函数被调用。槽函数在接收者所依附线程执行。也就是说:这种方式既可以在线程内传递消息,也可以跨线程传递消息

    Qt::BlockingQueuedConnection

    与Qt::QueuedConnection类似,但是会阻塞等到关联的slot都被执行。这里出现了阻塞这个词,说明它是专门用来多线程间传递消息的。

     

    2.Qt的信号槽函数只默认支持Qt的类型和C++提供的内建的基本类型,比如int double float等,根本不支持C++的std::string std::vector 自定义的struct类型。所以需要用Qt提供的Q_DECLARE_METATYPE和qRegisterMetaType来声明和注册自定义的类型和C++的其他类型。

    参考文章:

    1.Qt::ConnectionType(信号与槽的传递方式)

    2.Qt多线程通信 https://blog.csdn.net/hebbely/article/details/79428336

  • 相关阅读:
    如何为ubuntu server 14.04 安装图形界面
    linux远程拷贝命令-scp
    Git和Github简单教程
    DotNetNuke
    Orchard
    JIRA-6.3.6安装与破解
    BugFree的安装
    webapi部署到IIS 404错误
    Mysql分组求和&LIMIT
    Mysql正则
  • 原文地址:https://www.cnblogs.com/hitzzq/p/15123426.html
Copyright © 2011-2022 走看看