Qt5:多线程处理与使用之二(Qt5的方法)

Qt5:多线程处理与使用之二(Qt5的方法)

特点:使用相对而言复杂,但是比较灵活

 

思路:

 

项目实例:

         

 

 

源码交流:

mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include <QThread>
#include <QDebug>

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

    void MyTimeout();//线程处理函数
    void setFlage(bool flag = true);  //设置标志位,何时关闭子线程

signals:
    void MySignal();

public slots:


protected:
    bool isStop;
};

#endif // MYTHREAD_H

 

mythread.cpp

#include "mythread.h"

MyThread::MyThread(QObject *parent) : QObject(parent)
{
    isStop = false;
}

//线程处理函数
void MyThread::MyTimeout()
{
    while(false == isStop)
    {
        QThread::sleep(1);

        emit MySignal();   //每隔一秒发射一次信号
        qDebug()<<"子线程ID:"<<QThread::currentThread();  //显示当前线程的数值

        if(true == isStop)
        {
            break;
        }
    }
}

void MyThread::setFlage(bool flag)
{
    isStop = flag;
}

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include "mythread.h"
#include <QThread>
#include <QDebug>

namespace Ui {
class MyWidget;
}

class MyWidget : public QWidget
{
    Q_OBJECT

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

    void dealMySignal();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void dealClose();

signals:
    void startMyThread();  //启动子线程的信号

private:
    Ui::MyWidget *ui;

    MyThread *myThread;
    QThread *thread;
};

#endif // MYWIDGET_H

mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"

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

    //创建线程对象,不能够指定父对象
    myThread = new MyThread;
    //创建子线程对象
    thread = new QThread(this);
    //把子线程(对象)添加到自定义的线程类(对象)中
    myThread->moveToThread(thread);

    connect(myThread, &MyThread::MySignal, this, &MyWidget::dealMySignal);
    qDebug()<<"主线程ID:"<<QThread::currentThread();  //显示当前线程的数值

    connect(this, &MyWidget::startMyThread, myThread, &MyThread::MyTimeout);

    connect(this, &MyWidget::destroyed, this, &MyWidget::dealClose);


    //线程处理函数内部,不允许操作图形界面

    //connect()第五个参数的作用, 连接方式: 默认, 队列,直接
    //多线程才有含义
    //默认的时候
    //如果是多线程,默认使用队列
    //如果是单线程,默认使用直接方式
    //队列:槽函数所在线程和接受(信号)者一样
    //直接:槽函数所在线程和发送(信号)者一样



}

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

//处理收到的线程的信号, 作出相应动作
void MyWidget::dealMySignal()
{
    static int i = 0;
    i++;
    ui->lcdNumber->display(i);
}


//启动子线程
void MyWidget::on_pushButton_clicked()
{

    if(thread->isRunning() == true)  //这个判断个什么鬼?
    {
        return;
    }
    //启动子线程,但没有启动线程处理函数
    thread->start();
    myThread->setFlage(false);

    //**************************************************
    //不能够直接调用该线程处理函数
    //不然的话,都会导致线程处理函数和主线程是在同一个线程
    // myThread->MyTimeout();
    //**************************************************


    //只能够通过 signal - slot 来调用线程处理函数
    emit startMyThread();



}

void MyWidget::on_pushButton_2_clicked()
{
    if(thread->isRunning() == false)
    {
        return;
    }
    myThread->setFlage(true);
    thread->quit();
    thread->wait();
}

void MyWidget::dealClose()
{
    on_pushButton_2_clicked();
    delete myThread;  //因为没有指定父对象,所以不释放会溢出,但是没有设么大问题
}

前面还有一篇使用Qt4的方法来写Qt多线程,欢迎大家看

 

 

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

偕臧x

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

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

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

打赏作者

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

抵扣说明:

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

余额充值