• Qt多线程-总结QThread-QThreadPool-QtConcurrent


    博客地址已更改,文章数量较多不便批量修改,若想访问源文请到 coologic博客 查阅,网址:www.coologic.cn

    如本文记录地址为 techieliang.com/A/B/C/ 请改为 www.coologic.cn/A/B/C/ 即可查阅

    版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
    本文标题:Qt多线程-总结QThread-QThreadPool-QtConcurrent     本文地址:http://techieliang.com/2017/12/616/

    1. 总结

    QThread:Qt提供的最基础的线程类,一个对象管理一个线程,自己维护线程启动停止,创建销毁,当然也能基于此类自己建立一个线程池

    QThreadPool:Qt提供的基于QThread实现的线程池,只需要提供给线程池“任务”即可,每一个“任务”需要继承QRunnable,pool还贴心的帮忙在运行完成后释放内存。只不过runnable不支持信号槽,可以做多重继承QObject即可。

    QtConcurrent:并行计算的高级API,用起来很方便,完全不需要想线程的问题,全都是静态函数,可以运行自定义函数也提供了对容器的操作函数。

    相关博客:

    Qt多线程-QThread
    QThread安全的结束线程
    Qt多线程-QThreadPool线程池与QRunnable
    Qt多线程-QtConcurrent并行运算高级API

    2. 详细对比

    2.1. Qt事件处理

    只有QThread支持。但是其他两个可以用QApplication::postEvent发出事件

    2.2. Qt信号槽

    QThread完全支持,QThreadPool的QRunnable可以通过多重继承支持

    Concurrent提供的map/filter函数可以利用QFutureWatcher,使用此方式可用信号控制线程,但仍然无发通过信号槽对线程的数据做修改

    run就完全与信号槽无缘了,毕竟调用的只是一个函数

    2.3. 线程优先级

    这个优先级设置以后不一定有效,要看系统

    QThread完全支持,可以用setPriority函数

    2.4. 其他

    Concurrent所有函数都支持QFuture,同时Concurrent支持指定QThreadPool

    3. 使用

    • 只进行一次运行,或者调用不频繁不需要长时间开着线程,也不需要数据交互,直接Concurrent省事,毕竟只需要一行,也不需要定义什么类。但如果不希望包含QT += Concurrent,那就用线程池吧。
    • 单次不频繁,需要数据交互,三个都能用,对于Concurrent虽然没有信号槽但是可以自定义函数参数,注意线程安全即可。
    • 频繁调用,一定不要重复的创建销毁线程,可以用线程池
    • 长时间在幕后运行,一般这样的线程总要有数据交互的,建议直接QThread,主要是QThread还支持事件处理,能做的事情会很多。
    转载请以链接形式标明本文标题和地址:Techie亮博客 » Qt多线程-总结QThread-QThreadPool-QtConcurrent
  • 相关阅读:
    hdu2818 Building Block
    struct2面试准备
    Spring mvc 面试
    Spring 面试详解
    Java面试必备Springioc上
    redis高级命令4 持久化机制 、事务
    redis高级命令3哨兵模式
    redis高级命令2
    redis高级命令1
    redis基础二----操作set数据类型
  • 原文地址:https://www.cnblogs.com/techiel/p/8018540.html
Copyright © 2020-2023  润新知