【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、总结
这样线程也可以告一段落了,等使用的时候,添加进来就可以。