先写一个继承QThread的类
#ifndef MYTASK_H
#define MYTASK_H
#include <QObject>
#include <QDebug>
#include <QThread>
#include <QRunnable>
#include <QThreadPool>
#include <iostream>
#include <chrono>
#include <thread>
#include <mutex>
#include <map>
static std::mutex logOutMutex;
class MyTask : public QObject, public QRunnable
{
Q_OBJECT
public:
explicit MyTask(int index,std::map<int,int>* gloMap,std::mutex *gloMutex)
:index(index),gloMap(gloMap),gloMutex(gloMutex)
{
}
~MyTask()
{
}
private:
int index =0;
std::mutex *gloMutex;
std::map<int,int> *gloMap;
protected:
void run()
{
for(int i=0;i<5;i++)
{
std::this_thread::sleep_for(std::chrono::seconds(1));
std::lock_guard<std::mutex> gl(logOutMutex);
int pid= std::hash<std::thread::id>()(std::this_thread::get_id());
std::cout << pid <<", " << i<<"\n";
}
std::lock_guard<std::mutex> gl(*(this->gloMutex));
gloMap->insert(std::pair<int,int>(this->index,this->index*10));
}
};
#endif // MyTask_H
调用过程如下,这种方式稍微麻烦不如使用qt新特性QtConcurrent
#include "mytask.hpp"
int main()
{
QThreadPool pool;
pool.setMaxThreadCount(2);
std::map<int,int> retMap;
std::mutex retMutex;
for (int i = 0; i < 3;i++)
{
pool.start(new MyTask(i,&retMap, &retMutex));
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
while (retMap.size()<3) {
std::this_thread::sleep_for(std::chrono::microseconds(100));
}
std::cout << "result map:\n";
for (auto iter = retMap.begin(); iter != retMap.end(); iter++){
std::cout<<iter->first<<" "<< iter->second<<"\n";
}
return 0;
}