Qt多线程测试1

创建工作者线程类:
worker.h文件

#ifndef WORKER_H
#define WORKER_H

#include <QObject>

class Worker : public QObject
{
    Q_OBJECT
public:
    //explicit Worker(QObject *parent = nullptr);
    explicit Worker(QObject *parent = NULL);

    void setWorkFlag(bool stopWork = true);
signals:
    void workSignal(int*);
public slots:
    void doSomething(); //线程处理函数

private:
    bool bStopWork; //工作线程启停控制
};
#endif // WORKER_H

worker.cpp文件

#include "worker.h"
#include <QThread>
#include <QDebug>
#include <QTimer>

Worker::Worker(QObject *parent) : QObject(parent)
{
    bStopWork = false;
}

void Worker::doSomething()
{
    static int i = 0;
    while (!bStopWork)
    {
        i++;
        QThread::sleep(1);
        emit workSignal(&i); //与ui交互显示内容

        qDebug() << "worker thread id:"<< QThread::currentThread(); //打印输出当前工作线程id
    }
}

void Worker::setWorkFlag(bool stopWork)
{
    bStopWork = stopWork;
}

测试线程窗体:
在这里插入图片描述

mainwindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include"worker.h"
#include<QThread>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

signals:
    void startThread(); //启动子线程信号,必须通过信号-槽的方式启动线程函数
private slots:
    void on_btnStartThread_clicked();
    void on_btnStopThread_clicked();

    void workSignalCallBack(int *);//工作者回调事件
    void ondestroyed();//程序销毁事件

private:
    Ui::MainWindow *ui;

    Worker * m_myWork; //工作者
    QThread * m_thread;//工作者绑定的子线程
};
#endif // MAINWINDOW_H

mainwindow.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_myWork = new Worker; //创建工作者对象
    m_thread = new QThread(this); // 创建子线程
    m_myWork->moveToThread(m_thread);//把worker添加到子线程

    connect(m_myWork,SIGNAL(workSignal(int*)),this,SLOT(workSignalCallBack(int*))); //worker工作信号回调函数绑定
    connect(this,&MainWindow::startThread,m_myWork,&Worker::doSomething); //启动线程信号和具体工作函数绑定
    connect(this,&MainWindow::destroyed,this,&MainWindow::ondestroyed); //程序销毁事件

    qDebug()<<"主线程 id ="<<QThread::currentThread();
    m_thread->start();//启动子线程
}

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

void MainWindow::on_btnStartThread_clicked()
{
      //开始线程工作
      m_myWork->setWorkFlag(false);
      emit startThread();
}

void MainWindow::on_btnStopThread_clicked()
{
    //停止线程工作
    m_myWork->setWorkFlag(true);
}

void MainWindow::workSignalCallBack(int * a)
{
    ui->lcdNumber->display(*a); //显示工作内容
}

void MainWindow::ondestroyed()
{
    m_myWork->setWorkFlag(true); //控制线程工作函数停止

    m_thread->quit();
    m_thread->wait();

    delete  m_myWork;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码农的砖块

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

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

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

打赏作者

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

抵扣说明:

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

余额充值