当前位置 博文首页 > fearlazy:Qt多线程之QtConcurrent

    fearlazy:Qt多线程之QtConcurrent

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

    ?

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

    ?

    ?

    我觉得QtConcurrent有个很霸气的介绍。用谷歌翻译如下:“QtConcurrent命名空间提供了高级API,可以在不使用低级线程原语的情况下编写多线程程序”。不知道什么叫高级,我觉得应该是指使用时不关心底层多线程的实现而显得高层次吧。本想概括一下QtConcurrent的使用步骤,奈何发现QtConcurrent根本就不是个东西啊,它只不过是个命名空间。真正发挥作用的是该命名空间下定义的函数,这里要说的就是run函数(刚开始我还以为QtConcurrent只有run函数呢....。

    ????QtConcurrent::run的使用很简单,就是把要在子线程运行的函数和参数传入到run中就行了。还是用实例来说话。

    ????1.新建工程.....,定义非成员函数,然后用QtConcurrent::run来运行该函数。

    blob.png

    ? ? 为了作对比,把主线程也打印出来。运行结果:

    blob.png

    ?说明func函数是在子线程执行的。为什么我们这里要写个非成员函数来测试呢,难道成员函数就不行吗?当时是可以的。

    ????2.给Widget定义一个测试函数,不要和func重名了。然后用QtConcurrent::run来执行。

    blob.png

    ? ? 可以看到运行成员函数也就多传了一个对象的地址而已。事实上run函数有一堆的重载。

    blob.png

    从图中可以看到有96个之多,惊呆了! 除此之外还可以看到run可以传入QThreadPool指针,可以猜测它的多线程其实是通过线程池来实现的。

    最后还有一点很重要,那就是run是有返回值的,它返回了一个QFuture对象。QFuture不仅包括了运算结果还包含了一些状态信息。修改代码看看效果吧。

    ? 3.给func函数一个返回值。并用QFuture来接收run的返回值。代码如下:

    blob.png

    ?

    ? ? 程序运行结果:

    blob.png

    下一篇:没有了