多线程

Qt 下多线程有以下方法:

  • 从 QThread 派生:
    1. 继承 QThread

    2. 在子类中重写 run 函数

    3. 创建子类对象并调用 start() 函数

  • 使用业务类:
    1. 在主线程中创建一个 QThread 对象

    2. 在主线程中创建业务类对象

    3. 使用 moveToThread 将业务类移动到子线程

    4. 使用信号和槽处理业务

  • 使用 run:

    QFuture<void> fut1 = QtConcurrent::run(processFun, command);

    processFun 为线程回调函数

另外,还有线程池。线程池可以使用全局线程池或者本地线程池。线程池可以传入 QThread 或者 Lambda 表达式。可以调用 waitForDone 阻塞线程至所有线程退出。 Lambda 只能传入一个参数,但是可以使用 std::bind 传入多个参数

多线程中有以下需要注意的事项:

  • 业务对象在创建时不能指定父对象

  • UI 线程只能在主线程中处理

QMutex

由于 QMutex 是围绕 futex 设计的,因此其在无竞争的条件下是不会陷入内核态的,这点要比 std::mutex 高效

Last moify: 2022-12-04 15:11:33
Build time:2025-07-18 09:41:42
Powered By asphinx