一、问题描述

今天遇到一个问题,我在一个子线程中定义一个信号与槽函数,然后直接连接,最后会报错Socket notifiers cannot be enabled or disabled from another thread

connect(thread_udpSocket,&QUdpSocket::readyRead,this,&Mythread::read_UDPData);
exec();

二、问题解决

这是应为在高版本中QT的run函数限制比较多,基本无法使用信号与槽的方式,在子线程中只有run里面是子线程别的都是父线程,所以调用其他函数就是夸线程调用了。

解决办法:

1:我是直接在connect函数第五个参数添加一个直连的方式,但是这种方式隐患比较f多,如果测试基本没问题,做产品不行

第五个参数代表槽函数在哪个线程中执行 :
1)自动连接(AutoConnection),默认的连接方式,如果信号与槽,也就是发送者与接受者在同一线程,等同于直接连接;如果发送者与接受者处在不同线程,等同于队列连接。(这个是线程安全的,默认是这个)
2)直接连接(DirectConnection),当信号发射时,槽函数立即直接调用。无论槽函数所属对象在哪个线程,槽函数总在发送者所在线程执行,即槽函数和信号发送者在同一线程(注意这个是不安全的)
3)队列连接(QueuedConnection),当控制权回到接受者所在线程的事件循环时,槽函数被调用。槽函数在接受者所在线程执行,即槽函数与信号接受者在同一线程
4)锁定队列连接(QueuedConnection)
Qt::BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。
5)单一连接(UniqueConnection)
Qt::UniqueConnection:这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接

如果槽函数中有耗时操作,比如说while循环,主线程的信号子线程是不会响应的,除非使用直接连接(DirectConnection),connect(this, &Controller::kill, worker, &Worker::stopWork, Qt::DirectConnection);,此时,槽函数工作于主线程。

(Qt有两种多线程的方法,其中一种是继承QThread的run函数,另外一种是把一个继承于QObject的类转移到一个Thread里。 Qt4.8之前都是使用继承QThread的run这种方法,但是Qt4.8之后,Qt官方建议使用第二种方法。两种方法区别不大,用起来都比较方便,但继承QObject的方法更加灵活。)
2:就是使用movetothead,封装一个类和一个线程绑定,这个我还没用,暂时改参数使用

QT多线程run函数不能使用信号与槽相关推荐

  1. Qt图形界面编程入门(信号和槽通信机制)

    信号和槽机制是Qt的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信. 声明了信号的对象,当其状态改变时,信号就由该对象发送出去,而且该对象只负责发送信号,它不知道另一端是谁在接 ...

  2. theoretical-零基础学Qt4编程之Qt核心机制与原理之信号与槽-

    信号与槽 信号和槽机制是Qt的核心机制之一,要掌握Qt编程就需要对信号和槽有所了解.信号和槽是一种高级接口,它们被应用于对象之间的通信,它们是Qt的核心特性,也是Qt不同于其它同类工具包的重要地方之一 ...

  3. qt connect函数_Qt Inside信号和槽之connect

    上次和大家分享的是Qt信号和槽的一些宏定义以及元对象编译器.这次和大家分享信号和槽的connect函数到底连接了什么.还有元对象编译器都生成了什么代码. 很多讲Qt信号和槽的文章都会讲到元对象编译器生 ...

  4. QT每日一练day8:信号与槽机制

    一. 创建一个空的项目 添加QT的支持 添加main.cpp 编译报错,Q_OBJECT放在CPP文件中会报这个错误,必需放头文件,这个宏比较特殊,只有放头文件才能展开 添加头文件test.h mai ...

  5. 【Qt教程】1.6 - Qt5信号与槽、Single Slot emit、自定义信号、自定义槽

    信号与槽 1. 说明 概念:信号和槽,是Qt对象间通信的接口.信号Signal.槽Slot,分别对应着事件的发送端和接受端. 语法: connect( 信号的发送者, 发送的具体信号, 信号的接收者, ...

  6. QT学习笔记(4) 信号和槽

    一.代码编写 在上一次的学习中,我们把所有的控件布局和控制信息都放在主函数中,这样极其不方便开发和维护. 然后我们又发现在打开一个窗体时,其实最开始是先执行的构造函数.所以我们就想到可以把当前对象和子 ...

  7. python基本的信号与槽函数的使用 信号发射 槽函数接收

    # 熟悉信号与槽的使用 # -*- coding: utf-8 -*- from PyQt5.QtWidgets import * from PyQt5.QtCore import * import ...

  8. Qt工作笔记-ui文件连接信号与槽

    今天又学到了新的东西,当然,这个也是在和李主任交谈的时候学会的,以前从来没这么做过. 下面演示下,用的代码是下面这篇博文的代码: https://blog.csdn.net/qq78442761/ar ...

  9. Qt信号和槽函数连接不成功原因

    Qt信号和槽连接失败原因主要有以下几点: 1.槽函数并没有声明在类的public slots(或private slots或protected slots)里,因此,所想要成为槽函数的那个函数只是普普 ...

最新文章

  1. GridView自定义分页样式(上一页,下一页,到第几页)(新手教程)
  2. 如何在签约之前搞定难缠的客户
  3. java折半查找简述_折半查找(java版)
  4. 如何关掉Microsoft Office Click-to-Run服务
  5. 人人都可以写的可视化Python小程序第二篇:旋转的烟花
  6. Labview对mysql查询的数据进行展示
  7. 【CGAL_网格处理】平滑处理
  8. android自定义视频列表,Android列表视频播放开发之路
  9. 算法导论—分治策略(C语言)
  10. 微软 Office 全家桶被 GPT-4 革新:Word 一键变成 PPT,打工人的春天来了!
  11. android 左测设置功能,iqoo手机左边按键有什么作用?iqoo手机左侧按键介绍
  12. ceph(ceph是什么意思)
  13. 是不是安装了anaconda就不用安装python呢_dnf魔界是怎么样的,今天来带大家见识一下...
  14. SafeNet加密软件详细步骤
  15. Android ListView局部刷新item
  16. 2022年宜昌市网络搭建与应用比赛样题
  17. unity 加载ARCGIS 地球 实现天气系统
  18. 基于ARM平台下的GPRS/CQT测试系统设计研究
  19. [原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇)...
  20. PDF压缩大小的方法哪个更好用?

热门文章

  1. SPIFFS文件系统移植–基于STM32F407
  2. PAT甲级1140 Look-and-say Sequence:[C++题解]统计连续个数
  3. 小白也能看懂的git入门实操[狂神聊git学习笔记]
  4. 数学建模模型概述框架
  5. 安卓四大组件之Activity
  6. delphi pdf 转换 html5,Delphi使用Word ActiveX将doc转换为pdf
  7. python不可变的列表被称为_【Python学习】可变类型和不可变类型
  8. linux sysctl重启服务,Linux /etc/sysctl.conf重启没有生效
  9. html标记表示超链接,HTML常见标签学习
  10. include的两种形式、CPP的搜索路径