Qt有多种方法处理多线程,QThread 类用来处理所有与多线程有关功能,在本单元中我们会看到,它是Qt中最强大,最灵活的多线程处理手段。除了QThread, Qt还提供了其它命名空间、类及函数帮助我们实现多线程的需求。以下一一列举出:
- QThread: 这是Qt中所有与线程相关的类的基础。它可以被子类化来创建新线程,你需要重写(override) run 方法,另一种方式是创建它的一个实例,调用moveToThread把Qt object移到新线程中去。
- QThreadPool: 它用来管理线程,通过重用现存的线程减少线程创建的消耗。每个Qt应用都有一个全局QThreadPool实例,可通过QThreadPool::globalInstance()来访问。它与QRunnable类一同使用来控制、管理、回收可执行object。
- QRunnable:它提供了另一种创建线程的方法,它是所有Qt runnable object的基础。与QThread不同,QRunnable不是QObject的子类,你需要子类化它并且重写run方法才能使用QRunnable,如前述,QRunnable的实例由QThreadPool管理。
- QMutex QMutexLocker QSemaphore QWaitCondition QReadLocker QWriteLocker QWriteLocke:这些类处理线程之的同步任务。在某些场景下使用这些类能够避免线程间覆盖计算,线程试图读写一次只能处理一个线程的设备等问题。通常要手动管理这些问题。
- QCuncurrent:这个命名空间允许调用高层API创建多线程任务。无须处理互斥、信号量和线程同步问题。
- QFuture, QFutureWatcher, QFututeIterator, QFutureSynchronizer: 这些类与QtConcurrent一同使用,处理多线程和异步操作结果。
总的来说,Qt中有两种多线程的方法,第一种是基于QThread,这个low-level的方式提供了灵活的方式来处理多线程。然而,有很多方法可以减少使用QThread的工作量,我们后续会加以介绍。第二种方式是基于QtConcurrent命名空间的,这是一种high-level的方式,用于在应用中创建多线程。