QT多线程

QT多线程

在qt中使用了多线程,有些事项是需要额外注意的:

默认的线程在Qt中称之为窗口线程,也叫主线程,负责窗口事件处理或者窗口控件数据的更新

子线程负责后台的业务逻辑处理,子线程中不能对窗口对象做任何操作,这些事情需要交给窗口线程处理

主线程和子线程之间如果要进行数据的传递,需要使用Qt中的信号槽机制

class QThread : public QObject {
    Q_OBJECT

public:
    // 构造函数,创建一个QThread对象,可以指定父对象
    QThread(QObject *parent = nullptr);

    // 析构函数,销毁QThread对象
    ~QThread();

    // 请求线程退出,并设置返回码
    void exit(int returnCode = 0);

    // 判断线程是否已经结束
    bool isFinished() const;

    // 判断线程是否正在运行
    bool isRunning() const;

    // 获取线程的优先级
    Priority priority() const;

    // 设置线程的优先级
    void setPriority(Priority priority);

    // 设置线程的堆栈大小
    void setStackSize(uint stackSize);

    // 获取线程的堆栈大小
    uint stackSize() const;

    // 启动线程,可以指定优先级
    void start(Priority priority = InheritPriority);

    // 强制终止线程(不推荐使用)
    void terminate();

    // 阻塞调用线程,直到目标线程结束,可以指定超时时间
    bool wait(QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever));

signals:
    // 当线程完成执行时发出此信号
    void finished();

    // 当线程开始执行时发出此信号
    void started();

    // 当线程被终止时发出此信号
    void terminated();

public:
    // 返回指向当前线程的指针
    static QThread *currentThread();

    // 返回当前线程的ID
    static Qt::HANDLE currentThreadId();

    // 返回系统支持的理想线程数
    static int idealThreadCount();

    // 使当前线程休眠指定毫秒数
    static void msleep(unsigned long msecs);

    // 使当前线程休眠指定秒数
    static void sleep(unsigned long secs);

    // 使当前线程休眠指定微秒数
    static void usleep(unsigned long usecs);

    // 让出当前线程的CPU时间片
    static void yieldCurrentThread();

protected:
    // 线程的入口点,子类需要重写此函数以实现线程的主要逻辑
    virtual void run();
};

示例

/**
 * Created by gopher on 24-8-27 上午10:55
 */
#ifndef Q86_MTTHREAD_H
#define Q86_MTTHREAD_H
#include <QThread>
#include <QElapsedTimer>//用于计时
#include <QDebug>
#include <QVector>
#include <algorithm> // 包含 std::sort
#include <iostream>
class Generate : public QThread {

    Q_OBJECT


public:
    Generate(QObject *parent = nullptr);
    ~Generate();

protected:
    void run() override;//重写run()方法,实现线程的逻辑



private:
    int m_num;//主线发送的数字
    QVector<int> m_list;//存放随机数

public slots:
    void setNum(int num); //设置主线发送的数字

signals:
    void generateDone(QVector<int> list); //产生随机数完成的信号
};



class bubbleSort : public QThread {

Q_OBJECT


public:
    bubbleSort(QObject *parent = nullptr);
    ~bubbleSort();

protected:
    void run() override;//重写run()方法,实现线程的逻辑



private:
    QVector<int> m_list;//存放随机数

public slots:
    void recvNum(QVector<int> list);//接收随机数列表


signals:
    void finished(QVector<int>); //排序完成的信号

};


class quickSort : public QThread {

Q_OBJECT


public:
    quickSort(QObject *parent = nullptr);
    ~quickSort();

protected:
    void run() override;//重写run()方法,实现线程的逻辑




private:
    QVector<int> m_list;//存放随机数

public slots:
    void recvQuick(QVector<int> list);//接收随机数列表

signals:
    void finished(QVector<int>); //排序完成的信号

};


#endif //Q86_MTTHREAD_H

/**
 * Created by gopher on 24-8-27 上午10:55
 */
#include "mtthread.h"
#include <QElapsedTimer>//用于计时
#include <QDebug>
#include <cstdlib> // 包含 rand 和 srand 函数
#include <ctime>   // 包含 time 函数
#include <iostream>

Generate::Generate(QObject *parent) : QThrea
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可能只会写BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值