前言
一、线程,进程 介绍
线程:
是操作系统中独立运行的最小单位。每个线程都有自己的执行路径、程序计数器、堆栈和一组寄存器。线程共享进程的资源,如内存和文件描述符,可以并发执行,从而提高程序的并发性和响应性。
进程:
是操作系统中运行的一个程序实例。它拥有独立的内存空间和系统资源,如文件句柄、网络连接等。一个进程可以包含多个线程,这些线程共享进程的资源。进程之间相互独立,拥有各自的地址空间和系统资源,并通过进程间通信(IPC)机制进行交互。
总结起来,线程是进程的一部分,是可以并发执行的辅助单位,共享进程的资源。进程是独立运行的程序实例,拥有独立的资源和内存空间。线程通常用于并发执行任务,而进程通常用于隔离不同的应用程序和提供资源独立性。
二、创建线程
在 Qt 中,可以使用 QThread
类来创建线程。
Qt 中的线程以对象的形式被创建和使用。每一个线程对应着一个 QThread 对象。
创建线程的一般步骤如下:
- 定义一个继承自QThread的类。
- 在该类中重写run()方法,并在其中实现线程的任务逻辑。
- 创建该自定义线程类的对象。
- 调用对象的start()方法来启动线程。
- void run ( )
线程体函数,用于定义线程功能(执行流)
具体而言,它用于启动一个新线程并调用线程的 run() 方法。 - void start ( )
启动函数,将线程入口地址设置为 run 函数。
调用 start() 后,线程会自动调用 run() 方法执行线程的任务逻辑。
- void terminate ( )
强制结束线程(不推荐)
示例代码:
#include <QCoreApplication> #include <QThread> #include <QDebug> class MyThread : public QThread //创建线程类 { protected: void run() //线程入口,线程体函数 { qDebug() << objectName()<< " : begin"; for(int i=0; i < 5 ;i++) { qDebug() << objectName()<< " : "<< i; sleep(1); //休眠 1 秒 } qDebug() << objectName()<< " : end"; } int main(int argc, char *argv[]) //主线程入口函数 { QCoreApplication a(argc, argv); qDebug() << "main : begin"; MyThread t; //创建子线程 t.setObjectName("t1"); t.start(); //启动线程 qDebug() << "main : end"; return a.exec(); }
输出结果:
注意:
示例中 主线程 将优先于 子线程 结束。
所有线程都结束后,进程结束。
三、终止线程
怎末结束线程呢
在工程开发中,terminate () 是禁止使用的!
terminate ()会使操作系统 暴力终止线程,而不会考虑数据的完整性,资源释放等问题!
结束线程 方法:
设置一个标志位当需要终止线程时设置这个 标志位。
在 Mythread 中提供一个标志位变量,并且提供一个stop()函数,当需要将线程终止时将这个 m_stop 设置为true即可。
在线程的run()方法中,定期检查标志位的状态。如果标志位为真,则线程执行完当前任务后自行退出。
#include <QCoreApplication> #include <QThread> #include <QDebug> class MyThread : public QThread { protected: bool m_to_stop; //终止标志位 void run() //线程入口,线程体函数 { qDebug() << objectName()<< " : begin"; for(int i=0;(!m_to_stop)&&(i<5);i++) { qDebug() << objectName()<< " : "<< i; sleep(1); //每打印一次,休眠 1 秒 } qDebug() << objectName()<< " : end"; } public: MyThread() { m_to_stop = false; } void stop() { m_to_stop = true; } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() << "main : begin"; MyThread t; t.setObjectName("t1"); t.start(); for(int i=0;i<5;i++) { QThread::sleep(1); //休眠 if(i == 2) t.stop(); //休眠 3 秒后终止线程 } qDebug() << "main : end"; return a.exec(); }
输出结果: