一、前言
利用线程池可以多线程处理耗时任务,从而提升性能。使用回调函数处理返回数据使代码结构清晰易读。
二、代码示例
.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;
手写的可能会有拼写错误,功能是正常的。