QThread 是 Qt 框架提供的一个用于处理多线程的类,它允许开发者编写具有并发功能的应用程序,提高程序的响应速度、执行效率和用户体验。
在操作系统中,线程是进程内的执行单元,拥有独立的执行路径。每个线程有自己独立的栈空间,可以并发执行,实现任务的并行处理。QThread 封装了操作系统的线程接口,提供了一种跨平台的方式来管理和控制线程。
主要用于实现后台处理、长时间运行的任务(如文件读写、网络通信、复杂计算等),以避免阻塞主线程(用户界面线程),保持界面的流畅和响应。
QThread 线程类是实现多线程的核心类。
Qt 有两种多线程的方法,其中一种是继承 QThread 的 run()函数,
另外一种是把一个继承于 QObject 的类转移到一个 Thread 里。
法二:本例通过 QObject 类继承线程,然后在 MainWindow 类里使用。通过点击一个按钮开启线程。另一个按钮点击关闭线程。另外通过加锁的操作来安全的终止一个线程。
(可以通过 QMutexLocker 可以安全的使用 QMutex 以免忘记解锁。)
加锁来终止一个线程的原因:quit()和 exit()方法都不会中途终止线程。
要马上终止一个线程可以用 terminate()方法。但是这个函数存在非常不安全的因素,Qt 官方文档不推荐使用。 但是加锁会消耗一定的性能,增加耗时。
QThread示例
程序运行效果:
点击开启线程按钮后,应用程序输出窗口每隔 2 秒打印“正在运行 doWork1 函数”,当我们点击打断线程按钮后,窗口打印出“打断 doWork1 函数”。点击打断线程,会打断 doWork1函数的循环,doWork1 函数就运行结束了。再点击开启线程,可以再次运行 doWork1 函数。
把耗时的工作都放于槽函数下。
工人可以有不同的工作,但是每次只能去做一份。这里不同于继承 QThread 类的线程 run(),继承 QThread 的类只有 run()在新线程里。
而继承 QObject 的类,使用 moveToThread()可以把整个继承的 QObject 类移至线程里执行,所以可以有 doWork1(),doWork2()…等等耗时的操作,但是这些耗时的操作都应该作为槽函数,由主线程去调用。
进入循环后使用互拆锁判断 isCanRun 变量的状态,为假即跳出 while 循环, 直到 doWork1 结束。注意,虽然 doWork1 结束了,但是线程并没有退出(结束)。因为这个类移到线程里了,直到这个类被销毁。或者使用 quit()和 exit()退出线程才真正的结束。
工人类实例化。继承 QObject 的多线程类不能指定父对象。 工人类将自己移至 workerThread 线程里执行。 线程结束后,需要使用 deleteLater 来销毁 worker 对象和 workerThread 对象分配的内存。deleteLater 会确认消息循环中没有这两个线程的对象后销毁。
补充:
QMutex:用于保护共享资源,防止多个线程同时访问造成的数据不一致或损坏。
QReadWriteLock:比 QMutex 更灵活,提供读写锁机制,允许多个读取者同时访问但只允许一个写入者。
QSemaphore 和 QWaitCondition:用于更复杂的同步需求,比如控制线程的执行顺序或等待特定条件满足。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » QT QThread 线程类的使用及示例
发表评论 取消回复