######################################## 多线程 ######################################## Qt 下多线程有以下方法: - 从 QThread 派生: #. 继承 QThread #. 在子类中重写 run 函数 #. 创建子类对象并调用 start() 函数 - 使用业务类: #. 在主线程中创建一个 QThread 对象 #. 在主线程中创建业务类对象 #. 使用 moveToThread 将业务类移动到子线程 #. 使用信号和槽处理业务 - 使用 run: .. code-block:: cpp QFuture fut1 = QtConcurrent::run(processFun, command); processFun 为线程回调函数 另外,还有线程池。线程池可以使用全局线程池或者本地线程池。线程池可以传入 QThread 或者 Lambda 表达式。可以调用 *waitForDone* 阻塞线程至所有线程退出。 Lambda 只能传入一个参数,但是可以使用 *std::bind* 传入多个参数 多线程中有以下需要注意的事项: - 业务对象在创建时不能指定父对象 - UI 线程只能在主线程中处理 QMutex **************************************** 由于 QMutex 是围绕 futex 设计的,因此其在无竞争的条件下是不会陷入内核态的,这点要比 std\:\:mutex 高效 .. seealso:: - `qt - Performance of std::mutex and QMutex in MinGW 64 (posix thread version) `_ - `Internals of QMutex in Qt 5 `_