当前位置: 首页 > news >正文

【QT5-自我学习-线程qThread移植与使用-通过代码完成自己需要功能-移植小记3】

【QT5-自我学习-线程qThread移植与使用-通过代码完成自己需要功能-移植小记3】

  • 1、前言
  • 2、实验环境
  • 3、自我总结
    • (1)文件的编写
    • (2)信号与槽的新理解
    • (3)线程数据的传递
  • 4、移植步骤
    • 第一步:添加新文件
    • 第二步:初始化线程与连接内容
    • 第四步:编写线程文件与自定义内容
    • 第五步:补充其它内容
  • 5、实验代码-无
  • 6、细节部分
      • (1)各种报错
      • (2)undefined reference to。。。
      • (3)缺少“Q_OBJECT”关键字
  • 7、总结

1、前言

学习线程其实有一段时间了,当时只是学习,没有实际用起来,最近做的一个qt程序,发现如果不使用线程,那么就会导致界面卡死,这样才体现出线程的实际作用。

这里是第三章,主要是说明如何使用移植,如何嵌入到自己项目中。
并且开启本章前,默认你已经至少练习了一种线程使用方式,如果你练了,那么移植也是非常简单。

2、实验环境

实验环境还是挺重要的,因为有时候,在你电脑上能运行的东西,在别人的电脑就不一定能运行,这一部分的原因就可能是实验版本不一样。
系统环境:window环境
QT软件版本:qt 5.14.2

在这里插入图片描述

3、自我总结

(1)文件的编写

移植的话,如果我们想套在自己的程序上,其实主要两个部分的编写,更准确的是两个文件编写。
1、一部分就是线程文件:对于线程文件,我们需要自己知道,哪里是线程需要外壳,哪里是自己想要跑得程序库内容。
如下举例,在run内里内容,就是咱们自己移植后,需要替换的内容,这里需要我们自己跑自己内容。
在这里插入图片描述
2、另一部分就是主线程文件:在本例中,就是mainwindow.cpp内容,里面主要是连接“connect”,将函数信号槽等连接起来,这样我们点击按键才会触发相应函数。
在这里插入图片描述

(2)信号与槽的新理解

这里算是我自己的一个新理解,我自己在移植的时候,其实在按键里写其他功能内容,同样移植的时候,就复制了这部分内容。但是实际调用功能时,没有点击按键,结果就是咋整,都进不去线程。

用文字描述还是有点抽象,这里如下代码举例、

.....connect(ui->pushButton,&QPushButton::clicked,this,[=](){//发送信号emit starting(10000);//启动线程gen->start();});
......void MainWindow::on_pushButton_clicked()
{......
}

如上,如果我在主界面直接点击按键,是一定可以触发函数 >>on_pushButton_clicked() 和 开启线程的。
因为按键会触发一个clicked信号。
在这里插入图片描述
但是我实际应用时,也是这样写的,但是我不会去点击这个按键,而是使用软件代码去调用函数>>on_pushButton_clicked() ,这样虽然函数会执行,但是不会开启线程,因为没有clicked信号。

这对我这样的新手来说,是一次认知小提升,以前听到理论是提到信号和槽可以分开的,但是用久了,都是一个信号一个槽,会自然认为他们是一体的,没想过要看成两个独立东西。

(3)线程数据的传递

另外另外一点是线程之间传递数据的方式,开始自己不太会的话,可以使用全局变量,但是按照作者的教学,其实用跟简单的方式,这块我着暂时没有深入更多,但以后需要的话,还是需要自己仔细研究下。
在这里插入图片描述

4、移植步骤

这里大概讲讲移植需要做的事情,以供参考。

第一步:添加新文件

在自己工程加入新的.cpp和.h文件
在这里插入图片描述
用来盛放我们自己功能函数与线程这层外壳。
在这里插入图片描述

第二步:初始化线程与连接内容

这里主要是mainwindow.cpp内容,这些函数完全可以封装一下,只要是连接线程作用。
在这里插入图片描述

第四步:编写线程文件与自定义内容

回到线程函数,我们将线程内容填写完,同时写好自己需要内容。

在这里插入图片描述

第五步:补充其它内容

当然还有其它内容需要补充下,比如一些包含文件,一些声明等。
在这里插入图片描述
在这里插入图片描述

5、实验代码-无

本次无实验代码,主要是内容讲解。

6、细节部分

自己调试过程中,或者说移植过程中还是遇到了一些问题的,将其记录下来。

(1)各种报错

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当时报错的时候,真是一脸懵逼,完全不知道为啥,看代码就定位到447行,查看很久才知道,AexplicitA,就是自己失误打上去的,后来删除后,相继问题就没有,真的很神奇,自己都不知道咋打上去的。

(2)undefined reference to。。。

简单说,就是没有定义fnSend这个函数,这个好像和上一个问题一样的,在关键文件打错了,连带的,后续就没有了。
在这里插入图片描述

(3)缺少“Q_OBJECT”关键字

在这里插入图片描述

7、总结

这样线程也可以告一段落了,等使用的时候,添加进来就可以。

http://www.lryc.cn/news/137857.html

相关文章:

  • 后端开发12.商品模块
  • /usr/bin/containerd: Operation not permitted
  • 分析商务报表使用什么工具?
  • nginx文件配置
  • 视频云存储/安防监控EasyCVR视频汇聚平台如何通过角色权限自行分配功能模块?
  • 小程序定位到 胶囊的三个点大概中间
  • Maven详解
  • 音视频 ffplay命令-高级选项
  • [管理与领导-44]:IT基层管理者 - 个人管理 - 从掌握管理知识开始入门:管理的常识和基础
  • c#两个数进行交换
  • JVM——类加载与字节码技术—字节码指令
  • 同步与互斥——相互合作,相互制约
  • 7个改变玩法规则的ChatGPT应用场景
  • 软考高级系统架构设计师系列论文七十九:论软件产品线技术
  • Spring IOC容器:让Java对象的管理和配置更简单
  • 【C++小项目】实现一个日期计算器
  • Ext JS 之Microloader(微加载器)
  • 【科研】-- 如何将Endnote中参考文献格式插入到Word?
  • Python爬虫实战案例——第二例
  • 深入理解Spring的ImportBeanDefinitionRegistrar接口及其应用
  • 【面试题】你理解中JS难理解的基本概念是什么?
  • 微服务中间件--MQ服务异步通信
  • 爆火「视频版ControlNet」开源了!靠提示词精准换画风,全华人团队出品
  • 常用的数据可视化工具有哪些?要操作简单的
  • ssl卸载原理
  • 【C语言】动态内存管理,详细!!!
  • 2023年国赛 高教社杯数学建模思路 - 案例:退火算法
  • jenkins 日志输出显示时间戳的方式
  • geacon_pro配合catcs4.5上线Mac、Linux
  • vue 实现腾讯地图搜索选点功能(附加搜索联想功能)