蓉华教育嵌入式开发系列:[6] QT进程与线程
作者:蓉华教育
2025-03-10
96次阅读
进程是一个应用程序被操作系统拉起来加载到内存之后从开始执行到执行结束的这样一个过程。传统的进程有两个基本属性:可拥有资源的独立单位;可独立调度和分配的基本单位。
线程是进程中的一个实体,是被系统独立分配和调度的基本单位。引入线程之后,将传统进程的两个基本属性分开了,线程作为调度和分配的基本单位,进程作为独立分配资源的单位。 1.进程与线程的区别? 线程分为用户级线程和内核支持线程两类,用户级线程不依赖于内核;内核支持线程依赖于内核。 进程至少必须有一个线程,通常将此线程称为主线程。 线程作为调度和分配的基本单位,进程作为独立分配资源的单位。一个进程中可以包含多个线程。 进程要独立的占用系统资源(如内存),而同一进程的线程之间是共享资源的。进程本身并不能获取CPU时间,只有它的线程才可以。 2.QT中的进程 QProcess类:额外执行新的程序,执行程序就是一个新的进程执行 QProcess:进程管理类,使用QProcess类可以操作进程 QT进程之间的通讯: 3.QT中的线程 在Qt中提供了一个QThread类来描述线程,QTmread提供一个与平台无关的管理线程的方法,一个QThread对象管理一个线程。 需要线程的原因,第一个是因为进行耗时操作时,如果在UI线程(主线程)里面进行耗时操作,界面会不响应用户操作,产生卡界面的效果;第二个是为了提升程序性能,现在的电脑一般都是多核CPU,多线程并行处理事务,可以大大提升程序的性能。 QT中线程的使用方法: 继承QThread类,重写run()方法 使用moveToThread将一个继承QObject的子类对象移至线程,内部槽函数均在线程中执行 使用QThreadPool,搭配QRunnable (线程池) 使用QtConcurrent(线程池)
使用moveToThread将一个继承QObject的子类对象移至子线程,默认情况下我们在代码中创建的对象都属于主线程,这个对象的槽函数在调用的时候,占用的都是主线程的时间,我们也可以将一个QObject类型的对象或子类对象通过moveToThread移动到子线程中去,这样当这个对象的槽函数被信号触发调用的时候,槽函数占用的就是子线程的时间。
4.线程池是什么?
频繁创建和销毁线程会带来较大的性能开销,影响程序执行效率。线程池技术可以在一开始的创建多个线程,在需要有任务要处理的时候,就从线程池中拿出一个线程执行这个任务,在这个任务执行完以后,执行任务的线程在回到线程池中,减少了创建线程和销毁线程的时间,提升了程序的运行效率。
QT中提供的线程池:
QThreadpool管理多个线程的集合。QThreadpool管理和回收单个QThread对象,以帮助降低使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局QThreadpool对象,可以通过调用globallnstance()来访问。要使用QThreadpool线程之一,子类QRunnable并实现run()虚函数。然后创建该类的一个对象并将其传递给QThreadpool:start()。
通过QtConcurrent命名空间提供高级APl,可以在不使用互斥锁、读写锁、等待条件或信号量等低级线程原语的情况下编写多线程程序。使用QtConcurrent编写的程序会根据可用处理器内核的数量自动调整所使用的线程数。 5.QT线程互斥与同步关系 在多线程编程中,为了防止多个线程同时访问共享资源而导致数据不一致的问题,通常采用互斥锁来控制对这些资源的访问。Qt 提供了 QMutex 类作为互斥锁的一种实现形式。
对于复杂的需求,则可以利用 QWaitCondition 配合 QMutex 来达成目的。当某个特定条件未满足时,当前线程会被挂起并释放持有的锁;一旦其他线程改变了该条件的状态并通过调用相应的接口唤醒等待中的线程后,原线程重新获取锁继续执行。
上一篇:蓉华教育嵌入式开发系列:sqlite从入门到精通
下一篇:蓉华教育嵌入式开发系列:[5] QT的事件处理