Qt 线程的两种实现方法

Qt线程对比
第一种是继承QThread

代码案例
主函数 .h

#include <QMainWindow>
#include "myqthrea.h"

#define MAX 1
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void on_pushButton_clicked();     //开启
    void on_pushButton_2_clicked();   //停止
private:
    Ui::MainWindow *ui;
    MyQthrea *m_thread[MAX];
};

主函数 .cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

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

void MainWindow::on_pushButton_clicked()
{
    for(int i=0;i<MAX;i ++){
        m_thread[i]=new MyQthrea();
    }
    for(int i=0;i<MAX;i++){
        m_thread[i]->start();
    }
}

void MainWindow::on_pushButton_2_clicked()
{
    for(int i=0;i<MAX;i++){
        m_thread[i]->stop();
    }
}

继承QThread线程的函数 重写run .h


```cpp
#ifndef MYQTHREA_H
#define MYQTHREA_H

#include <QObject>
#include <QThread>

class MyQthrea : public QThread
{
    Q_OBJECT
public:
    MyQthrea();
    void stop();

protected:
    void run();
private:
    bool flag;
};

.cpp

#include "myqthrea.h"
#include <QDebug>

MyQthrea::MyQthrea()
{
    flag=true;
}
void MyQthrea::run()
{
    while (flag) {
        for(int i=0;i<10;i++){
            qDebug()<<"输出==="<<i;
        }
    }
}

void MyQthrea::stop()
{
    flag=false;
}

实现的结果
在这里插入图片描述

第二种是继承QObject 的方法 这种是通过信号和槽的调用,也是Qt的主要推荐的,也符合Qt的中法特色
在这里插入图片描述
主函数 .h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

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

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

signals:
    void signalWork();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    ObjThread* m_objthread;
    QThread* m_thread;
};

主函数 .cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_objthread=new ObjThread();    //工作线程
    m_thread=new QThread();     //线程类
    m_objthread->moveToThread(m_thread);  //工作线程移动到线程中    挂载
    //线程结束自动销毁
    connect(m_thread,&QThread::finished,m_thread,&QObject::deleteLater);
    //主程序信号和线程槽的绑定
    connect(this,&MainWindow::signalWork,m_objthread,&ObjThread::slotWork);

    m_thread->start();
}

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

void MainWindow::on_pushButton_clicked()
{
    emit signalWork();
}

线程类 .h

#ifndef OBJTHREAD_H
#define OBJTHREAD_H

#include <QObject>

class ObjThread : public QObject
{
    Q_OBJECT
public:
    explicit ObjThread(QObject *parent = 0);

signals:    

public slots:
    void slotWork();

private:
    bool iswork;
};

.cpp

#include "objthread.h"
#include <QDebug>

ObjThread::ObjThread(QObject *parent)
    : QObject(parent)
{
     iswork=false;
}

void ObjThread::slotWork()
{
    iswork=true;
    while (iswork) {
        qDebug()<<"我在拼命工作中";
        sleep(2);
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值