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