1、基本概念
线程(Thread):程序执行的独立流,可以与主线程并行运行。
同步(Synchronization):确保多个线程在访问共享资源时的一致性和完整性。
互斥(Mutex):一种同步机制,用于防止多个线程同时访问某个资源。
信号与槽(Signals and Slots):Qt中的通信机制,支持跨线程通信。
2、解决问题思路
Qt里常用的多线程方法有QThread、QtConcurrent,或者线程池。QtConcurrent可能比较简单,因为它可以用高阶函数封装,比如map或者run,处理起来比较方便。
如要加载多个图像需要并行处理,对每个图像应用某种处理算法,比如滤波、边缘检测等等。每个处理任务应该是独立的,这样并行起来效率才会高。处理后的结果需要收集起来,合并显示。合并显示可能需要将多个处理后的图像排列在一个大图上,或者分多个视图显示。
接下来是合并显示的问题。合并的话,可能需要将各个处理后的QImage拼接成一个大的QImage,或者在UI中使用多个QLabel来分别显示每个处理后的图像。如果用户希望合并成一个图像,可能需要计算布局,比如网格排列,然后逐个绘制到大的QPixmap上,再显示在QLabel或QGraphicsView中。
同步问题需要注意,因为并行处理完成后,需要在主线程更新UI。Qt的信号槽机制可以在这里派上用场,每个处理任务完成后发送信号,携带处理后的图像,然后在主线程的槽函数中收集这些结果,等所有结果都到达后再进行合并和显示。
主要步骤:
- )加载图像:读取多个图像文件到列表中
- )并行处理:使用QtConcurrent进行并行图像处理(或多个图像板并行处理)
- )结果收集:等待所有处理任务完成
- )合并图像:将处理后的图像排列到画布上
- )显示结果:在UI中展示合并后的图像
- )高算力,1080P图像不缩放处理;预训练模型yolov8n替换为lzyv8n,可大大减少训练轮数。
3、Qt中的多线程实现方式
3.1 使用QThread
Qt的QThread
类是实现多线程的基本构件。通过创建QThread
的实例并运行它,可以执行独立的线程。
创建线程:QThread *thread = new QThread();
开始线程:thread->start();
执行线程:通过重写run()
方法或使用QRunnable
接口来定义线程执行的任务。
3.2 使用QtConcurrent---重点介绍
功能:QtConcurrent
模块提供了一组简化多线程编程的工具,可以轻松实现数据并行处理。Qt Concurrent模块包含支持程序代码并发执行的功能,使用 QtConcurrent 编写的程序会根据可用的线程处理器核心数量自动调整使用的线程数,这意味着编写的应用程序在部署到多核系统时将自动扩展。。
1)操作流程
Step 1 在.pro文件中添加QT += concurrent
Step 2 包含头文件和声明命名空间
#include <QtConcurrent/QtConcurrent>
using namespace QtConcurrent;
Step 2 然后在耗时接口所在的头文件中包含QtConcurrent,并在所在源文件中调用QtConcurrent::run()
QtConcurrent::run(this,&QtConcurrentDemo::working);
3.2 QFutureWatcher
QFutureWatcher类是Qt中用于监视QtConcurrent异步任务的进度和结果的类。