QT<34> 利用线程池处理耗时任务以及回调函数的使用

一、前言

利用线程池可以多线程处理耗时任务,从而提升性能。使用回调函数处理返回数据使代码结构清晰易读。

二、代码示例

.h文件

cpp 复制代码
#include <QRunnable>
#include <functional>

class WorkTask : public QRunnable{

public:
  WorkTask(std::vector<int> &inData,std::function<void (std::vector<int> &)> &callBack,uint32_t startIdx,uint32_t manageNum) : inData_(inData),callBack_(callBack),startIdx_(startIdx), manageNum_(manageNum){
  outData_.reserve(inData_.size());
};

  void run override{
    for(uint32_t i = startIdx_; i < startIdx_ + manageNum_ && i < inData_.size(); ++i){
      uint32_t data = inData_[i] + 1;  //耗时任务处理
      outData_.push_back(data);
    }
    callBack_(outData_);
  }

private:
  std::vector<int> inData_;
  std::vector<int> outData_;
  std::function<void (std::vector<int> &)> callBack_;
  uint32_t startIdx_;
  uint32_t manageNum_;

.cpp文件

cpp 复制代码
std::vector<uint32_t> originalData(100,0);
std::vector<uint32_t> resultData;
resultData.reserve(originalData.size());

QMutex mutex;
std::function<void (std::vector<int> &)> cellBack = [&resultData,&mutex](std::vector<int> &value){
  mutex.lock();
  for(auto& v : value){
    resultData.push_back(v);
  }
  mnutex.unlock();
};

QThreadPool *pool = new QThreadPool();
uint32_t mtNum = 16;
pool->serMaxThreadCount(mtNum);

uint32_t totalSize = originalData.size();
uint32_t chunkSize = qMax(totalSize / mtNUm,(uint32_t)1);
uint32_t startIndex = 0;

uint32_t endIndex = chunkSize;
for(; startIndex < originalData.size();){
  pool->start(new WorkTask(originalData,callBack,startIndex,endIndex - startIndex));
  startIndex += chunkSize;
  endIndex +=  chunkSize;
}

pool->waitForDone();
delete pool;
pool = nullptr;

手写的可能会有拼写错误,功能是正常的。

相关推荐
小徐不徐说5 小时前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
ragnwang6 小时前
Notes: Python pybind11 import C++ module
开发语言·c++·python
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
骑着蜗牛撵大象3276 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
Dxy12393102167 小时前
JS DES 加密详解
开发语言·javascript·arcgis
充值内卷7 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
云和数据.ChenGuang7 小时前
深入解析 Python 的 dir():从用法到 CPython 源码实现
开发语言·人工智能·python·langchain
nice_lcj5208 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
樱花树下的数学喵10 小时前
手写简易 STL string|C++ 字符串底层实现
开发语言·c++
jimy110 小时前
C++ 报错的 qualifiers 的意思
开发语言·c++