QT中一种简单的开线程方法QThread

    在项目开发过程中,单线程是不能满足需求的,这就要求我们对多线程有一定的了解,对于QT项目开发者来说,开启线程有三种方式,

第一种:C++的开线程方式;

第二种:自定义一个继承自QObject的类,把要处理的事情放在这个类中实现,然后再new一个QThread指定,把这个类通过moveToThread移动到指定的线程中进行处理;

第三种:也就是我们这里重点分析的一种,自定义一个类,继承自QThread,然后,重写run函数,把要处理的事项放在run函数中。

具体步骤如下:

1.创建一个mainwindow的工程,具体步骤按照QT的提示一步一步完成即可

 2.新建一个C++类,并继承自QThread

3. 选择C/C++,C++ Class,并点击“选择”

4. 输入线程类的名称,并勾选图中所示内容,点击下一步,点击完成即可

5. 在添加的线程类中,.h文件中添加run函数,用于重写

6. 在线程类的cpp文件中,写你要处理的逻辑业务

特别注意:子线程只能处理数据,不能直接在子线程操作界面(否则会崩溃),如果想要操作界面,需要将子线程的数据传递给界面主线程进行操作,这样就用到了我们信号和槽,子线程和主线程之间传递参数。

子线程和主线程之间传递数据:

首先,在主界面的头文件中,添加线程对象

其次,在主界面的cpp文件中,添加信号和槽连接(这里用到自定义信号),在子线程的头文件中定义你要传递的数据(如果是多个数据,最好以结构体的方式传递),这里使用的自定义信号,参数是结构体形式

再次,在界面主线程中的构造函数中开启线程,也可以根据自己的需要开启线程(比如,点击按钮时开启,或者接收到信号触发时开启,这个根据用户自己的需求来定)

 

再次, 在子线程的cpp文件中通过emit函数发送该信号

在主界面cpp文件中连接信号和槽,用于接收子线程传递过来的数据,这里的信号是自定义的信号,参数是非基本类型,所以需要对信号进行注册,具体参考图片说明。

 

 以上就实现了一个界面主线程,一个数据处理线程,子线程提供数据,通过信号和槽传递给界面主线程,界面主线程对接收到的数据进行处理。

善后处理:

线程运行完毕,需要安全退出(线程异常退出有可能导致崩溃),这里安全退出有两种方式,一种是标志位,一种是通过检查线程运行状态,通过quit,wait来实现,这里我们用第二种方式退出线程。

 

总结:在使用线程的时候,不仅要关注线程开启的时机,同时还要关注线程安全退出,这样才能保证程序的健壮性,如果线程开启的较多,且开启关闭比较频繁,建议使用线程池来处理。个人在项目开发中的一些总结,希望对你有用。

 

 

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值