QT学习笔记(进程与多线程)

C++ QT 多线程与进程学习笔记


一、进程管理(QProcess)
  1. 启动外部进程

    • 核心类 : QProcess

    • 作用: 执行系统命令或外部程序,支持参数传递和输入输出控制。

    示例代码

    :

    cpp

    Copy

    cpp 复制代码
    QString program = "/bin/ls";  // 指定可执行程序路径
    QStringList arguments;        // 参数列表
    arguments << "-l" << "-a";    // 添加参数
    
    QProcess *myProcess = new QProcess(parent); // parent 用于自动内存管理
    myProcess->execute(program, arguments);     // 同步执行(阻塞当前线程)
    // 或 myProcess->start(program, arguments);  // 异步执行(非阻塞)
  2. 注意事项

    • 使用 start() 异步执行时需监听 started()/finished() 信号。
    • 通过 readAllStandardOutput()readAllStandardError() 获取输出。
    • 设置工作目录:myProcess->setWorkingDirectory(path);
    • 错误处理:监听 errorOccurred(QProcess::ProcessError) 信号。

二、多线程编程(QThread)
  1. 继承 QThread 实现线程

    核心步骤

    :

    • 继承 QThread,重写 run() 方法。

    • run() 中执行耗时操作,通过信号与主线程通信。

    代码模板

    :

    cpp

    Copy

    cpp 复制代码
    class WorkerThread : public QThread {
        Q_OBJECT
    public:
        void run() override {
            // 耗时操作(如计算、文件读写)
            QString result = doWork();
            emit resultReady(result); // 通过信号传递结果
        }
    signals:
        void resultReady(const QString &s);
    };
  2. 线程启动与资源释放

    cpp

    Copy

    cpp 复制代码
    WorkerThread *thread = new WorkerThread;
    thread->start();          // 启动线程
    connect(thread, &WorkerThread::finished, thread, &QObject::deleteLater); // 自动释放内存
  3. 注意事项

    • 不要直接调用 run() :必须通过 start() 启动线程。
    • 避免 GUI 操作:子线程中禁止操作界面组件(需通过信号槽通信)。
    • 资源释放 :设置线程对象的 AutoDelete 属性或手动 deleteLater()

三、线程同步与互斥
  1. QMutex(互斥锁)

    • 作用: 保护共享资源,防止多线程同时访问。

    使用示例

    :

    cpp

    Copy

    cpp 复制代码
    QMutex mutex;
    int sharedData = 0;
    
    void ThreadA::run() {
        mutex.lock();
        sharedData += 1;
        mutex.unlock();
    }
  2. QSemaphore(信号量)

    • 作用: 控制对多个相同资源的访问(如缓冲区管理)。

    示例

    :

    cpp

    Copy

    cpp 复制代码
    QSemaphore sem(5); // 初始化5个可用资源
    
    void Worker::accessResource() {
        sem.acquire(); // 请求资源(可用资源减1)
        // 操作资源...
        sem.release(); // 释放资源(可用资源加1)
    }
  3. 其他同步机制

    • QMutexLocker : 自动管理 QMutex 的锁定与解锁(推荐使用)。
    • QWaitCondition: 线程间条件等待(如生产者-消费者模型)。
    • QReadWriteLock: 区分读写操作,提高并发性能。
  4. 避免死锁

    • 按固定顺序加锁。
    • 使用超时机制:mutex.tryLock(timeout)

四、进程 vs 线程对比
特性 进程 线程
资源开销 高(独立内存空间) 低(共享进程资源)
数据共享 需 IPC(如管道、套接字) 直接共享内存(需同步)
适用场景 隔离性要求高(如第三方应用调用) 高并发任务(如数据处理)

五、常见问题与最佳实践

信号槽连接类型

  • 跨线程通信使用 Qt::QueuedConnection(默认自动识别)。

线程优先级

  • 设置优先级:thread->setPriority(QThread::HighPriority);

调试技巧

  • 使用 qDebug() << QThread::currentThreadId(); 打印线程 ID。
相关推荐
小短腿的代码世界5 小时前
Qt行情协议解析与二进制编解码优化:从FIX到自定义协议的全链路架构
开发语言·qt·架构
袁小皮皮不皮6 小时前
1.HCIP BFD 学习笔记(优化版)
服务器·网络·笔记·网络协议·学习·智能路由器·ip
装不满的克莱因瓶6 小时前
【自动驾驶领域】学习 Cityscapes 数据集——城市街景语义理解的标准基准
人工智能·pytorch·python·深度学习·学习·机器学习·自动驾驶
luoyayun3617 小时前
Qt/QML + FFmpeg 实现多音频文件顺序拼接功能
qt·ffmpeg·音频拼接
清辞8537 小时前
产品经理需求推进流程
大数据·深度学习·学习·产品经理
YM52e8 小时前
鸿蒙PC ArkTS 声明合并问题深度解析与最佳实践
学习·华为·harmonyos·鸿蒙·鸿蒙系统
海兰9 小时前
【实用程序】电商销售分析仪表盘 — 从零搭建一个AI参与的全栈数据洞察系统
人工智能·学习·算法
Strugglingler9 小时前
【Qt,OpenGL, RHI,Wayland 等概念梳理】
qt·opengl·wayland·rhi·x11·egl·glx
ken22329 小时前
在 Libreoffice Calc中输入自定义表情字符时,需要保存之后,才能正常显示
学习
zwenqiyu9 小时前
P5283 [十二省联考 2019] 异或粽子题解
c++·学习·算法