Qt学习之路---QThread

QThread 是 Qt 框架中用于创建和管理线程的类。它提供了一种方便的方式来执行并发任务,并允许你在多线程环境中编写应用程序。QThread 类封装了底层平台特定的线程实现,并提供了一些高级特性,如事件循环和线程间通信。

Qthread 官网:

QThread Class | Qt Core 5.15.14

public fun(常用函数)

QThread(QObject *parent = nullptr)
virtual~QThread()构造函数
voidexit(int returnCode = 0)退出线程的事件循环
boolisFinished() const判断线程是否完成
boolisRunning() const判断线程是否在运行
intloopLevel() const

返回线程的当前事件循环级别。

注意:这只能在线程本身内调用,即当它是当前线程时。

QThread::Prioritypriority() const返回正在运行的线程的优先级。如果线程没有运行,这个函数返回InheritPriority。
voidrequestInterruption()请求线程中断
voidsetPriority(QThread::Priority priority)设置线程的优先级
voidsetStackSize(uint stackSize)设置线程堆栈的大小,如果超过这个大小,线程不会工作
uintstackSize() const返回最大线程堆栈的大小
boolwait(QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))阻塞线程

Public Slots 

voidquit()和exit函数功能相似
voidstart(QThread::Priority priority = InheritPriority)通过调用run开始执行线程
voidterminate()

终止线程的执行。线程可以立即终止,也可以不立即终止,这取决于操作系统的调度策略。在terminate()之后使用QThread::wait()来确保。

当线程终止时,所有等待线程结束的线程都将被唤醒。

Signals 

voidfinished()线程结束后发出
voidstarted()线程开始时发出

Static Public Members 

QThread *create(Function &&f)创建线程,执行函数f,使用start执行
QThread *currentThread()返回一个指向管理当前执行线程的QThread的指针。
intidealThreadCount()返回可在系统上运行的理想线程数。
voidyieldCurrentThread()将当前线程的执行转交给另一个可运行线程(如果有的话)。注意,操作系统决定切换到哪个线程。
延时函数
voidmsleep(unsigned long msecs)毫秒        
voidsleep(unsigned long secs)
voidusleep(unsigned long usecs)纳秒

 Protected Functions

intexec()

进入事件循环并等待exit()被调用,返回传递给exit()的值。如果通过quit()调用exit(),返回值为0。

这个函数应该在run()中调用。

virtual voidrun()线程的起始点

 线程的优先级

QThread::IdlePriority0scheduled only when no other threads are running.
QThread::LowestPriority1scheduled less often than LowPriority.
QThread::LowPriority2scheduled less often than NormalPriority.
QThread::NormalPriority3the default priority of the operating system.
QThread::HighPriority4scheduled more often than NormalPriority.
QThread::HighestPriority5scheduled more often than HighPriority.
QThread::TimeCriticalPriority6scheduled as often as possible.
QThread::InheritPriority7use the same priority as the creating thread. This is the default.

QThread对象管理程序中的一个控制线程。QThreads在run()中开始执行。默认情况下,run()通过调用exec()启动事件循环,并在线程内运行Qt事件循环。

您可以通过使用QObject::moveToThread()将工作对象移动到线程中来使用它们。

示例

运行结果

代码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <list>
#include <QRandomGenerator>
#include <QTimer>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();


private slots:
    void pro_random();
    void on_btn_begin_clicked();

    void on_btn_stop_clicked();

    void on_btn_re_clicked();

signals:
    void randomOk(std::list<int>);

private:
    Ui::MainWindow *ui;
    std::list<int> list;
    QTimer *timer;
};

#endif // MAINWINDOW_H

 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QThread>
#include <QRandomGenerator>
#include <QTimer>
#include "sort.h"

static int count = 0;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //初始化定时器对象,并设置1000ms延时,每秒产生一次timeout信号
    timer = new QTimer(this);
    timer->setInterval(1000);
    connect(timer,&QTimer::timeout,this,&MainWindow::pro_random);
    Aces *acse = new Aces(this);
    connect(acse,&Aces::acse_success,this,[=](std::list<int> list_a, std::list<int> list_d){
        ui->text_asce->clear();
        ui->text_desc->clear();
        for (auto i : list_a)
        {
            ui->text_asce->append(QString::number(i));
        }
        for (auto i : list_d)
        {
            ui->text_desc->append(QString::number(i));
        }
    });
    acse->start();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::pro_random()
{
    QRandomGenerator *tor = QRandomGenerator::system();
    int num = tor->bounded(100);
    list.push_back(num);
    ui->text_random->append(QString::number(num));
    emit randomOk(list);
    count++;
    if (count == 10)
    {
        timer->stop();
    }
}
//开始生成
void MainWindow::on_btn_begin_clicked()
{
    timer->start();
}

//停止生成
void MainWindow::on_btn_stop_clicked()
{
    timer->stop();
}

//重新生成
void MainWindow::on_btn_re_clicked()
{
    ui->text_random->clear();
    ui->text_asce->clear();
    ui->text_desc->clear();
    count = 0;
    list.clear();
    timer->start();
}

sort.h

#ifndef SORT_H
#define SORT_H

#include <QThread>
#include <QObject>
#include <list>
#include "mainwindow.h"


//升序
class Aces : public QThread
{
    Q_OBJECT
public:
    explicit Aces( MainWindow *mainwindow, QObject *parent = nullptr);
protected:
    void run() override;

signals:
    void acse_success(std::list<int>, std::list<int>);
public slots:
private:
    MainWindow *mainwindow;
};

#endif // SORT_H

sort.cpp

#include "sort.h"
#include <functional>


Aces::Aces( MainWindow *mainwindows, QObject *parent) : QThread(parent),
    mainwindow(mainwindows)
{

}

void Aces::run()
{

    connect(mainwindow,&MainWindow::randomOk,this,[=](std::list<int> list){
        std::list<int> acse_list(list);
        acse_list.sort();
        std::list<int> dcse_list(list);
        dcse_list.sort(std::greater<int>());
        emit acse_success(acse_list, dcse_list);
    });
    //开始事务循环
    exec();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值