Skip to content

Latest commit

 

History

History
113 lines (59 loc) · 4.22 KB

ConcurrentExamples.md

File metadata and controls

113 lines (59 loc) · 4.22 KB

Qt线程和并发编程示例

[toc]


1、说明

类名 功能
UseQThread1 Qt通过【实例化】QThread,使用moveToThread将QObject子类槽函数在子线程中执行
UseQThread2 Qt通过子类化,继承QThread,重写run实现子线程
UseQThreadPool Qt使用线程池QThreadPool示例
RunFunction QtConcurent::run使用示例,在另一个线程中运行一个函数。
Map QtConcurrent::map使用示例,可以在多线程环境下高效地处理大量数据,
并且可以返回一个QFuture对象,可以使用它来跟踪数据处理的进度。
Mapped QtConcurrent::mapped使用示例,与 map() 类似,
不同之处在于它返回了一个包含返回值的新容器。
MappedReduced QtConcurrent::mappedReduced使用示例,与mapped()类型,
相当于将mapped()的结果放入到一个单线程函数中进行计算
IOThread 在QT子线程中操作IO对象,包括QAbstractSocket、QFile、QSerialPort等

2、相关博客

相关博客
👉CSDN👈

3、实现效果

1.1 UseQThread1

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

UseQThread1-tuya

2、UseQThread2

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

UseQThread2-tuya

1.3 UseQThreadPool

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

    image-20230218120351892

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

    image-20230218120716966

1.5 RunFunction

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

image-20230224151913976

1.6 Map

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

image-20230226215928039

1.7 Mapped

QtConcurrent::mapped使用示例,与 map() 类似,不同之处在于它返回了一个包含返回值的新容器。

在mapped中异步计算多个0~n的数的和,并通过返回值传递出来。

image-20230309210116047

1.8 MappedReduced

QtConcurrent::mappedReduced使用示例;

将数组通过参数1传入,在参数2的函数中多线程并行计算,然后将参数2的函数的返回值传入参数3的函数中,在参数3的函数中单线程计算。

image-20230312113522409

1.9 IOThread

  1. 在Qt框架中,QIODevice及其子类(如QSerialPort、QTcpSocket等)设计用于单线程内的操作。
  2. 如果尝试在创建QIODevice对象的线程之外的另一个线程中使用它,将会引发错误或不可预期的行为。
  3. 这是因为QIODevice依赖于Qt的信号和槽机制进行事件处理和数据通信,而这些机制本身不是线程安全的。
  4. 但有时候实际场景中数据量很大,就需要在子线程中进行通信,这里就演示如何在子线程中使用QIODevice

ioThread-tuya