ConcurrentExamples.md 3.5 KB
Newer Older
1 2 3 4 5 6 7 8
# Qt线程和并发编程示例

[toc]

---

## 1、说明

mahuifa's avatar
mahuifa 已提交
9 10 11 12 13
|      类名      | 功能                                                         |
| :------------: | ------------------------------------------------------------ |
|  UseQThread1   | Qt通过【实例化】QThread,使用moveToThread将QObject子类槽函数在子线程中执行 |
|  UseQThread2   | Qt通过子类化,继承QThread,重写run实现子线程                 |
| UseQThreadPool | Qt使用线程池QThreadPool示例                                  |
mahuifa's avatar
mahuifa 已提交
14
|  RunFunction   | QtConcurent::run使用示例,在另一个线程中运行一个函数。       |
mahuifa's avatar
mahuifa 已提交
15
|      Map       | QtConcurrent::map使用示例,可以在多线程环境下高效地处理大量数据,<br>并且可以返回一个QFuture对象,可以使用它来跟踪数据处理的进度。 |
mahuifa's avatar
mahuifa 已提交
16
|     Mapped     | QtConcurrent::mapped使用示例,与 map() 类似,<br/>不同之处在于它返回了一个包含返回值的新容器。 |
mahuifa's avatar
mahuifa 已提交
17
| MappedReduced  | QtConcurrent::mappedReduced使用示例,与mapped()类型,<br/>相当于将mapped()的结果放入到一个单线程函数中进行计算 |
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

 


## 2、相关博客

|                           相关博客                           |
| :----------------------------------------------------------: |
| 👉[CSDN]()👈 |




## 3、实现效果

### 1.1 UseQThread1

> 1. Qt通过实例化QThread,使用moveToThread将QObject子类槽函数在子线程中执行;
> 1. 分别实现了将线程封装在类内部的和在类外部指定线程两种方式;
> 1. 演示了正确创建线程和退出线程的方式   ,避免出现僵尸线程或者卡死情况。                

![UseQThread1-tuya](ConcurrentExamples.assets/UseQThread1-tuya.gif)



### 2、UseQThread2

> 1. Qt通过子类化,继承QThread,重写run实现子线程;
> 2. 演示了线程的简单使用和正确退出的方式。

![UseQThread2-tuya](ConcurrentExamples.assets/UseQThread2-tuya.gif)
mahuifa's avatar
mahuifa 已提交
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64



### 1.3 UseQThreadPool

> 1. QT使用QThreadPool、QRunnable的简单示例程序;
> 2. 演示了使用全局线程池和局部线程池;               
> 3. 演示了在添加任务后修改最大线程个人导致的内存泄漏问题和解决办法。

* 正常使用线程池

  ![image-20230218120351892](ConcurrentExamples.assets/image-20230218120351892.png)

* 修改最大线程个数导致内存泄漏

  ![image-20230218120716966](ConcurrentExamples.assets/image-20230218120716966.png)
mahuifa's avatar
mahuifa 已提交
65 66 67 68 69 70 71 72



### 1.5 RunFunction

> QtConcurent::run使用示例,在另一个线程中运行一个函数。

![image-20230224151913976](ConcurrentExamples.assets/image-20230224151913976.png)
mahuifa's avatar
mahuifa 已提交
73 74 75 76 77 78 79 80 81



### 1.6 Map

> 1. 使用QtConcurrent::map()在多线程环境下高效地处理大量数据;
> 2. 使用QtConcurrent::map()在多线程环境下批量执行成员函数。

![image-20230226215928039](ConcurrentExamples.assets/image-20230226215928039.png)
mahuifa's avatar
mahuifa 已提交
82 83 84 85 86 87 88 89 90 91



### 1.7 Mapped

> QtConcurrent::mapped使用示例,与 map() 类似,不同之处在于它返回了一个包含返回值的新容器。
>
> 在mapped中异步计算多个0~n的数的和,并通过返回值传递出来。

![image-20230309210116047](ConcurrentExamples.assets/image-20230309210116047.png)
mahuifa's avatar
mahuifa 已提交
92 93 94 95 96 97 98 99 100 101



### 1.8 MappedReduced

> QtConcurrent::mappedReduced使用示例;
>
> 将数组通过参数1传入,在参数2的函数中多线程并行计算,然后将参数2的函数的返回值传入参数3的函数中,在参数3的函数中单线程计算。

![image-20230312113522409](ConcurrentExamples.assets/image-20230312113522409.png)