QT 线程之间通信

1.先说QT线程。都知道QT线程有两种使用方式,一种是继承QThread重写run(),一种是继承QObject然后再MovetoThread()到线程下。我也是刚学QT,之前一直做MFC。现在有个问题,我想要创建的是单次运行的线程,就是处理完后就自动退出线程,常用于设备连接。都知道使用start()启动线程,但是线程处理完后并没有自动退出,而是需要判断isrunning后再quit,然后重复movetothread->start才能重新启动线程,当然这时的线程ID会变化。
2.假设要启动多线程,那就要new多个QThread。我的处理函数都是在一个QObject里面,如果仅仅是new一个QObject处理对象,但就需要处理好线程同步的问题。我是直接一个QObject对应一个QThread,既然是不同的对象副本那就不需要考虑线程同步问题,我不知道这样有没有什么问题,需要的空间代价肯定是比较高。
3.不同线程之间共享数据,一个是全局变量,做好同步互斥就可以。现在要说的是信号与槽函数的方式。主要涉及两种信号类型:Qt::DirectConnection(直连方式:同步),
Qt::QueuedConnection(排队方式:异步)
显然在同一个线程里用信号是使用同步的方式就好。但是在不同线程中,更需要的是异步的方式。信号槽传递的参数可以有很多,这里只说传递的自定义结构体。代码如下:
结构体:

typedef struct RecogInfo
{QString strServerIP;QString strGanID;int AllTransSize;int OBUSize;int CPCSize;int AllMatchSize;int OBUMatchSize;int CPCMatchSize;RecogInfo(){strServerIP = "";strGanID = "";AllTransSize = 0;OBUSize = 0;CPCSize = 0;AllMatchSize = 0;OBUMatchSize = 0;CPCMatchSize = 0;qRegisterMetaType<RecogInfo>("RecogInfo");}
}RecogInfo1;

这是一个简单的结构体类型,但是如果需要跨线程传递就需要在使用前加一句:

qRegisterMetaType<RecogInfo>("RecogInfo");

这里我是直接写在构造函数里面了。如果没有这句DEBUG会输出错误:

QObject::connect: Cannot queue arguments of type 'RecogInfo'
(Make sure 'RecogInfo' is registered using qRegisterMetaType().)13:38:40: Debugging has finished

按照提示照做就好了。
具体原因我也不太懂,参照MFC消息机制,线程传递消息也是需要New出来一块内存去存储,因为是异步的,如果传的是局部变量,当消息还未被目标线程处理时该变量就被析构了,消息到来处理函数不知道去哪找传递的数值。QT手册有这么一句话:After a type has been registered, you can create and destroy objects of that type dynamically at run-time.
注册后可动态创建和销毁。
注册类型后就可以跨线程使用了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序 开发过程中遇到的坑(一)

21241.我们使用app.json文件来对微信小程序进行全局配置&#xff0c;决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 的时候在pages中写注释的时候回报错。 例如&#xff1a; {"pages":[//这是首页面"pages/welcome/welcome"] } 此时就会报错…

java 创建日程到期提醒_日程管理工具—Things 3

Mac上最好用的日程管理工具是哪个&#xff1f;Things 3 for Mac是首选&#xff0c;Things3 Mac全新的设计&#xff0c;外观简洁、大气&#xff0c;功能也是非常强大的&#xff0c;让你用一种优雅而直观的方式来管理个人事务&#xff0c;无论在生活还是工作中&#xff0c;都能取…

数据库优化小结

WHERE条件的优化&#xff1a;1、IN&#xff1a;至少多一个转换的过程&#xff08;先试图转成多个表的连接&#xff0c;如果转换不成功先执行IN里面的子查询&#xff0c;再查询外层记录&#xff09;2、NOTIN&#xff1a;不能应用表索引&#xff0c;可用NOT EXISTS替换的3、<&…

使用VS制作MFC、libmysql.dll出现计算机缺少msvcr120.dll和msvcp120.dll问题

自己应客户要求做了一个数据库的查询工具&#xff0c;结果在客户电脑那边运行出现了计算机缺少msvcr120.dll和msvcp120.dll问题&#xff0c;一开始以为是MFC程序自身有动态链接&#xff0c;结果才发现是libmysql.dll本身依赖于msvcr120.dll和msvcp120.dll&#xff0c;这两个库对…

python 流程控制if判断

简单看下if判断在python的基本用法 # gyf28 定义变量gyf # if gyf > 20: 判断 gyf 是不是〉20# print(你真年轻) 简单实现了 if判断的用法 下面我们再来做一个例子 if判断 gyf是不是〉18 并且〈 22 如果是 则执行打印的任务 输出 表白 如果条件不成立输入打印 阿姨…

python同步oracle_Python cx_Oracle 7引入苏打文档存储

在线QQ客服&#xff1a;1922638专业的SQL Server、MySQL数据库同步软件cx _甲骨文7 .0是非常受欢迎的蟒蛇甲骨文数据库接口,现在是PyPI上的产品。cx _甲骨文是一个开源包,它涵盖了大蟒数据库应用编程接口规范,并添加了许多支持神谕高级功能的内容。安东尼 图宁加刚刚发布了cx _…

总结2010展望2011

总结2010 展望2011转载于:https://www.cnblogs.com/zhouxiuquan/archive/2011/01/28/1947269.html

XP下使用FFMPEG(API和exe)遇到的问题和解决方法。

XP下使用FFMPEG&#xff08;API和exe&#xff09;遇到的问题和解决方法。1、需求背景2、遇到的问题3、解决方法下载链接1、需求背景 因为最近接到项目上的一个需求&#xff0c;就是在MP4&#xff08;H264编码&#xff09;文件里叠加指定字符&#xff0c;于是就想到了使用FFMPE…

钢材规格解读的软件_万维软件ERP五金建材行业解决方案

一、五金建材行业的特征&#xff1a;1、企业的规对较小&#xff1a;身为老板却“身兼多职”&#xff0c;采购、销售、发货、出纳啥都做&#xff1b;2、业务非常多样&#xff1a;虽然这类企业规模小&#xff0c;但也涉及到批发、零售、工程(局部工程)、家装等经营型态&#xff0…

MSDE 认证方式

1. 停止 MSSQLSERVER 以及所有其他相关服务&#xff08;如 SQLSERVERAgent 2. 打开注册表编辑器。要打开注册表编辑器&#xff0c;请依次单击开始和运行&#xff0c;然后键入&#xff1a;“regedt32”3. 找到以下两个子项之一&#xff08;取决于 MSDE 是作为默认 MSDE 实例安装…

duilib学习

记录duilib自学过程。 最近年底公司也没啥事情&#xff0c;自己就想着上网看看duilib怎么制作界面&#xff0c;因为之前想学习一直没时间&#xff0c;现在来看看。 其实学习的就好办法就是看demo&#xff0c;关于duilib网上的学习教程并不多&#xff0c;自己跟着demo敲一遍代…

2017.12.1T19_B2_2zuoye

package com.whxiong.work01; import java.util.Scanner; public class Calculator { Scanner input new Scanner(System.in); public void show() { char Calculator; double num 0; double num1 0; System.out.println("请输入第一个整数&#xff1a;"); …

git指令快捷 idea_IDEA+Git+Gitlab使用详细教程

GitLab 安装踩坑502错误码和访问卡顿解决办法Gitlab对内存的要求高&#xff0c;我的服务器Centos 72核心2G内存&#xff0c;频繁报502错误&#xff0c;访问也很卡。原因可能是可用内存太少。# free -m 查看可用内存这里看到free不多了&#xff0c;解决办法有扩内存或者使用虚拟…

记:ubuntu下交叉编译arm的链接库

以第三方库libjpeg为例&#xff0c;编译所需要的三步&#xff1a; 1、配置./configure脚本参数&#xff0c; ./configure --prefix/home/huanghaitao/Winshare/jpeg-9c/libjpeg CCarm-linux-gnueabihf-gcc --hostarm-linux --enable-shared --enable-static–prefix&#xff0…

flash 绘图API:绘制弧线

把之前没有记录的笔记都记录一下&#xff0c;顺便方便日后查询。绘制弧线&#xff0c;对于一些制作课件的人来讲会有一些用处的。绘制弧线采用的基本思路是采用描点的方法实现。从一个开始角度&#xff0c;到另一个角度结束&#xff0c;在这个角度区间里面进行描点连线。 【A&a…

scala中Stream理解

// Stream:Stream is lazy List;// Stream惰性求值指它只确定第一个值&#xff0c;后面的值用到再求值&#xff0c;这样可以防止数据过大全部加载导致内存溢出// 将Range转化成Streamval stream (1 to 1000).toStreamprintln(stream) // Stream(1, ?)println(stream.head…

关于SDL SDL_CreateWindowFrom和SDL_DestroyWindow第二次后无法将视频显示出来。

最近自己用QT搞一个监控平台的程序UI&#xff0c;然后后台一些视频处理是使用FFMPEG和SDL来做的。 在关闭播放窗口SDL_DestroyWindow后&#xff0c;再次去显示视频就会发现显示不出来。代码如下 int SDLPlayer::SDLPlay() {SDL_Window *sdlScreen{ NULL };//窗口SDL_Renderer*…

简单概念

一、数据库查询I. 直接生成sql语句。 sql server每次都要对其进行编译&#xff0c;在性能方面不会有很大的提高。另外也不够安全。容易被攻击.II. 使用带参数的sql命令。这种方式sql server只对其编译一次&#xff0c;对于不同的参数可以重复使用编译后的命令。提高了性能.III.…

瘦子的肠道菌群和胖子的区别_胖子和瘦子的终极 PK:比基因?比运动?比肠道细菌!...

学术会议的自助餐厅里碰见了小师妹&#xff0c;小师妹餐盘里的食物堆成了小山&#xff0c;几位同学指指小师妹的「救生圈」说道&#xff1a;「多日不见&#xff0c;增肥不少&#xff0c;看来这世间没有无缘无故的胖&#xff0c;也没有无缘无故的瘦啊&#xff01;」小师妹一脸委…

转: Vim快捷键分类

Vim快捷键分类 http://www.cnblogs.com/jikey/archive/2011/12/28/2304341.html 一. 移动&#xff1a;h,j,k,l: 左&#xff0c;下&#xff0c;上&#xff0c;右。w: 下一个词的词首。e:下一个词的词尾。b:上一个词的词首。<>: v 模式选中后进行缩进。二. 跳转&#xff1a…