Qt为开发者提供了多种实现并发的方法,其中包含了QThread、QThreadPool以及QtConcurrent。下面我将从实际应用角度出发,来说明一下在什么情况下适合用什么样的方法。
- QThread 这种方法最为重量级,直接创建一个线程,然后可以将你需要并发操作的QObject放入该线程之中执行。因此这种方法最大的优点就是可以使用信号槽的队列特性,可以异步且顺序的执行操作。特别适合一些带有状态的操作。例如我可以先异步调用一个初始化方法,然后再调用一个获取方法,绝对不会出现未初始化就获取的线程安全问题。
- QThreadPool与QtConcurrent QtConcurrent本质上就是QThreadPool的封装,推荐直接使用QtConcurrent,这种方法将会从线程池中抽取一个线程来进行计算,因此避免了线程创建销毁的开销,效率较QThread高,但是调用无法保证顺序,适用于一些纯粹的计算,无状态、无相关性。例如获取到了图片列表使用QtConcurrent同时对所有的图片进行下载。
就BrainKit这款程序而言,其内部建立了一个线程专门管理各种状态,同时为每个App提供一个GUI线程,为每一台设备提供一个数据流线程。