Qt多线程之QtConcurrent

    我觉得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

演示站
上一篇:Qt的线程池QThreadPool
下一篇:QtConcurrent之map函数的使用

发表评论

评论列表

2018-10-29 19:44:40

写的不错。我想转载

2018-10-29 19:50:26

result.waitForFinished();会阻塞主线程,这样还有意义吗?

2018-10-30 22:55:23

下次研究研究

2018-10-30 22:55:45

尽管转载吧