Contents

qt多线程

08-线程的使用方式2-添加修改任务类_哔哩哔哩_bilibili

Qt中两个模块中涉及到了并发编程相关的内容,QtCore提供了基础的较为低层的线程控制类,QtConcurrent模块则实现了高级的并发模型,例如 Map-Reduce `Filter-Reduce

QtCore QtConcurrent
QThread map,mapped,mappedReduced
QThreadPool filter,filterd, filteredReduced
run

线程类——QThread

两种使用方式:

  1. 继承QThread类
    1. 任务类继承QThread类
    2. 重写QThread的run方法,实现子线程业务逻辑

注意:
这种方式当run 函数执行完成线程就退出了。并且这种方式除非你手动调用exec() 否则是没有任何事件循环运行在线程中的。

记住,QThread对象本身是存在于创建它的(老)线程中的,而不是在run 方法所在的新线程中。这意味着所有以队列方式调用的slots以及invoked的方法都会在老线程中执行,因此开发人员如果想让槽函数在新线程中执行必须使用下面的方式二(movetothread)。

QThread的构造函数是在老线程中执行的,而run方法是在新线程中执行。如果成员变量既在继承的Qthread的构造函数中使用,又在run方法中被使用,呢么这个成员变量就是被两个线程所使用,需要考虑线程安全问题了。

  1. moveToThread方式(属于QObject类的一个方法)
    1. 任务类继承QObject类
    2. 添加任务方法
    3. 主线程中创建QThread类,和任务类
    4. workclass->moveToThread(thread_1)

线程管理

信号通知:

线程开始——started
线程结束——finished

管理方法:

查询状态——isFinished/isRunning
停止线程——exit/quit/terminate
休眠线程——sleep/msleep/usleep

线程池——QThreadPool

使用方式:

  1. 任务类继承QRunnable类,重写纯虚函数run
  2. 调用QThreadPool静态方法 QThreadPool::globalInstance() 返回全局线程池对象
  3. 调用全局线程池对象的start,将任务类实例添加进去

QtConcurrent