前言
本篇文章来讲解一下QT中的多线程使用方法。
其实线程这个概念对于我们来说并不陌生,main函数在多线程中一般就被称为主线程。
在QT中,使用QThread类可以方便地创建新的线程并在其中执行任务。以下介绍一些常用的QT多线程的技术和方法。
一、多线程概念介绍
多线程是指一个进程中包含至少两个执行流,即多个线程,每个线程都可以独立运行,访问该进程中的共享资源,并且可以与其它线程同步行动。多线程应用程序通常比单线程应用程序具有更好的响应速度和更好的资源利用率,适合于一些需要高效处理大量数据和执行复杂任务的场景。
在多线程应用中,程序的执行流被抽象为线程,每个线程都有自己的执行上下文,包括寄存器、堆栈和程序计数器等,线程之间共享进程地址空间中的数据和资源。线程之间的通信和同步主要通过共享内存和同步原语来实现,如信号量、互斥锁和条件变量等。
多线程可以提高程序效率,但也会增加线程的并发开销和线程安全问题。
二、创建一个线程
在QT中创建一个线程需要使用到QThread的这个类。
这里定义一个Mythread类这个类继承自QThread,要想使用多线程我们需要重写run()函数,run()函数就是线程执行的主体,将需要处理的逻辑放入run函数中执行即可。
#include <QCoreApplication> #include <QDebug> #include <QThread> class Mythread : public QThread { protected: void run() { for(int i = 0; i < 5; i++) { qDebug() << "Mythread"; sleep(1); //休眠1s } } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Mythread t1; t1.start(); for(int i = 0; i < 5; i++) { qDebug() << "Main Thread"; QThread::sleep(1); //休眠1s } return a.exec(); }
执行效果:
可以看到主线程和创建出来的线程并发执行互不干扰。
三、start和terminate函数
QThread 类在启动新线程时使用 start() 函数,该函数的作用是将 run() 函数放入一个新线程并在新线程中启动执行代码。根据 Qt 的官方文档,start() 函数应该被认为是线程对象的构造函数,因为每次调用 start() 函数都会生成一个新的线程对象。
当需要中止线程时,terminate() 是一个用于中止线程的函数。但建议不要使用 terminate() 函数,在大多数情况下这会导致未定义的行为,而且可能会造成数据损失或未同步的状态。terminate()函数是暴力终止线程的方法,他是直接让线程终止,并不会等到线程退出后再将线程结束,在实际开发中一般不建议使用这个函数。
四、如何不使用terminate函数终止线程
解决方法:设置一个标志位当需要终止线程时设置这个标志位。
在Mythread中提供一个标志位变量,并且提供一个stop()函数,当需要将线程终止时将这个m_stop设置为true即可。
#include <QCoreApplication> #include <QDebug> #include <QThread> class Mythread : public QThread { bool m_stop; protected: void run() { for(int i = 0; (!m_stop) && (i < 5); i++) { qDebug() << "Mythread"; sleep(1); //休眠1s } } public: void stop() { m_stop = true; } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Mythread t1; t1.start(); for(int i = 0; i < 5; i++) { qDebug() << "Main Thread"; QThread::sleep(1); //休眠1s if(i == 3) { t1.stop(); } } return a.exec(); }
运行效果:
总结
多线程是非常重要的一个知识点,大家需要将他掌握,需要注意的就是终止线程时不要使用terminate函数,因为使用这个函数可能会出现意想不到的错误。