不定期更新开源软件的入门教程和二次开发相关内容,欢迎大家阅读和留言交流
目前拟定的相关方向为:
这个月拟更新部分Qt 相关的内容
1.1 Qt 多线程
1.2 Qt mvc 框架
1.3 Qt mvvm 框架
1.4 Qt mfc 支持
今天文章的标题为 Qt 多线程之 QThread
基本介绍
在进行桌面应用程序开发时,假设需要处理较为复杂的逻辑,如果只用主线程,会导致卡顿,因为一个线程只能同时处理一件事。因此需要多线程,主线程处理窗口事件,其他子线程处理逻辑并将结果传递给主线程。
QT中使用多线程需注意以下事项:
1.默认线程为窗口线程,也叫主线程,负责窗口事件处理及窗口控件的数据更新。
2.子线程负责后台的业务逻辑,不能对窗口进行任何操作。
3.子线程与主线程之间的数据传递需要QT的信号和槽机制。
一. QThread
QT提供了一个线程类Qthread,接下来介绍需要用到的函数。
1.公共成员函数
bool isFinished();//判断进程是否结束
bool isRunning();//判断进程是否在进行
Priority priority();//获取线程优先级
void setPriority(Priority priority);//设置线程优先级
void exit();//退出线程
void wait();//等待线程任务完成,然后退出线程,一般会在exit函数后使用。
2.槽函数
void quit();//效果等同于exit
void start();//启动线程
3.信号
void finished();//线程结束后会发出该信号
void started();//线程开始时发出该信号
4.静态函数
QThread* QThread::currentThread();//返回当前线程的指针
int QThread::idealThreadCount();//返回可以运行的理想线程数,与当前电脑CPU核心数相同
5.任务处理函数
[virtual protected] void run();//子线程处理的任务写到该函数中,该函数为虚函数,因此需要建立子类继承QThread重写run,而且是protected,因此不能类外调用,使用时调用start(),start会自动调用run.
使用方法
QT提供多种建立子线程的方法,先介绍简单的一种。
第一步:创建一个类,使其继承QThread。
Class MyThread : public QThread
第二步:重写run函数,在函数内写子线程要处理的任务
第三步:在主线程创建子线程对象,即在mainwindow.cpp中如下操作:
MyThread* subThread = new MyThread;
第四步:调用start
subThread->start();
实例演示
接下来通过实例演示QT多线程的使用,实现生成随机数。
重写run函数,注意增加需要的头文件,代码如下:
MyThread.h
recvNum函数用于接收主线程传过来的需要生成的随机数总数;
SendArray信号用于将生成的随机数传递给主线程
MyThread.cpp
QElapsedTimer
用于计算执行任务所需要的时间,单位是毫秒
mainwindow.cpp
主窗口析构时会发射destroyed信号,此时执行子线程的退出和delete操作。
main.cpp
此处由于QT版本为5.1.2,无法识别Qvector
运行结果
运行程序,点击start按钮,显示生成的随机数
应用程序输出当前线程地址以及生成的随机数数量和所需时间。
下期我们介绍下Qt多线程的第二个部分 QObject::moveToThread 的用法
页面更新:2024-03-12
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号