赞
踩
#include <QCoreApplication> #include <QtConcurrent> #include <QDebug> #include <iostream> #include <csignal> #include <unistd.h> using namespace std; int g_1 = 0; // 测试中断方式 void signalHandler(int signum) { qDebug() << "Receive signal ("<< signum << ")。"; } void function(int &num) { num = num * 10; qDebug() << QThread::currentThreadId() <<num; } double fuc(int a ,int b) { if ( b == 0 ) { throw b; } double ret = a/b; return ret; } int testTryCatch() { double res; try //定义异常 { res = fuc(6, 3); cout<<"The result of x/y is : "<<res<<endl; res = fuc(4,0); //出现异常 } catch(double) //捕获并处理异常 { cerr<<"error of dividing zero.\n"; exit(1); //异常退出程序 } return 0; } void mapFunc(QString& data){ qDebug() << data << QThread::currentThreadId(); data.append("_new"); g_1 += 1; qDebug()<< g_1 << QThread::currentThreadId(); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // testTryCatch(); // auto lmd = [] (int& para) { // para += 10; // return para; // }; // int p(10); // qDebug() << lmd(p); // qDebug() << p; QList<int> list = {1,2,3,4,5}; QtConcurrent::map(list, function); // qDebug() << QThread::currentThreadId(); QtConcurrent::run(function, 1); // signal(SIGINT, signalHandler); // while (true) { // qDebug() << "to sleep"; // sleep(1); // } QMap<int, QString> dataMap; dataMap.insert(1, "first"); dataMap.insert(2, "second"); QtConcurrent::blockingMap(dataMap, mapFunc); qDebug() << dataMap; qDebug() << g_1; return a.exec(); }
QtConcurrent 是Qt中高阶的多线类模块
比 Qthread 更加方便,在使用的时候一般使用静态成员函数来实现各种形式的多线程;
典型使用方法是:处理使用list、map 这样的容器存储的数据,每一个容器里的元素会产生一个线程来处理
例子中, dataMap 插入了两个元素, 使用blockingMap函数来处理这个dataMap的数据,这种类似于信号量方式处理相同类型的批量数据,但是已经封装了类似于QMutex 这样的安全处理,保证操作的原子性;
主要区别:根据需要处理的数据量,和平台核心数自动分配线程
而且会自动动态扫描运行所在设备平台cpu 核心数线程数;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。