当前位置 博文首页 > fearlazy:QtConcurrent之map函数的使用

    fearlazy:QtConcurrent之map函数的使用

    作者:[db:作者] 时间:2021-06-18 12:35

    文章可能被更新,最新地址:http://www.fearlazy.com/index.php/post/95.html?

    ?

    ?

    上一篇学习了QtConcurrent的run函数使用,重点是在说QtConcurrent实现了多线程。实际上应该说多线程让QtConcurrent实现了并行可能更准确点。不然map函数就不好理解了。那么QtConcurrent的map函数又有什么用呢?这就要先看看map的参数了。map函数有两个参数,第一个是序列(如QList),第二个参数是一个函数。它的作用就是同时用第二个参数来计算第一个参数中的每一个元素,且结果直接覆盖到元素中。

    ????blob.png

    ????如QtConcurrent::map传入图中的QList和Func,QList中的1、3、5、7、9会同时执行Func函数。执行结束后QList值变为2、4、6、8、10。

    ?用实例说话:

    ????1.先定义Func函数。

    void?Func(int&?a){
    ????a?+=?1;
    }
    

    ? ?2.定义一个QList,调用map函数。

    ????QList<int>?alist;
    ????alist<<1<<3<<5<<7<<9;
    
    ????QFuture<void>?f?=?QtConcurrent::map(alist,Func);?//map函数
    ????f.waitForFinished();
    ????qDebug()<<"alist"<<alist;
    

    ??运行结束后再打印出alist

    blob.png

    alist的值变为了2、4、6、8、10。另外Func函数被调用了5次,且多数在不同的线程中执行的,为什么说是大多数而不是全部呢?因为我们之前试过线程池默认最大线程数是4,而我们这里有5个数。

    ?

    和map函数长的很相近的还有两个函数,一个是mapped,另一个是mappedReduced。 mapped的作用和map类似,只是把计算结果放到了新的容器中。举例:

    ????1.定义一个用于计算的函数,该函数有返回值

    int?func2(int?a){
    ????return?a?+?1;
    }
    

    ? ?2.调用mapped函数

    ????QList<int>?alist;
    ????alist<<1<<3<<5<<7<<9;
    
    ????QFuture<int>?f?=?QtConcurrent::mapped(alist,func2);?//QFuture的类型为int
    ????f.waitForFinished();
    ????qDebug()<<"alist"<<alist;
    ????qDebug()<<"newlist"<<f.results();
    

    blob.png

    ?从运行结果可以看到原容器的值没有改变。

    ?

    mappedReduced函数比mapped多一个参数,这个参数也是个函数。作用就是将mapped出来的结果再计算最终得出一个值。如上例中计算得出的结果是2、4、6、8、10。我们可以在写一个函数将这些值加起来得到一个值。这个函数遵循如图形式

    blob.png

    result就是最后的结果。intermediate就是mapped出来的结果。接着举例。

    ?1.定义一个计算和的函数,形如上图。

    void?sum(int&?result,?const?int&?b){
    ????result?+=?b;
    }
    

    ?2.调用mappedReduced函数,查看运行结果。

    ????QList<int>?alist;
    ????alist<<1<<3<<5<<7<<9;
    
    ????QFuture<int>?result?=?QtConcurrent::mappedReduced(alist,func2,sum);
    ????result.waitForFinished();
    ????qDebug()<<result.result();
    

    blob.png

    结果是30,是由2、4、6、8、10相加得来的。

    ?

    ?

    ?

    下一篇:没有了