QT总结之线程

来源:互联网 发布:ubuntu常用命令 编辑:程序博客网 时间:2024/06/06 01:34

QT总结之线程

实现一个计时器

1.创建一个线程类继承thread

mythread.h

#ifndef MYTHREAD_H#define MYTHREAD_H#include <QObject>class myThread : public QObject{    Q_OBJECTpublic:    explicit myThread(QObject *parent = 0);    //线程处理函数    void myTimeout();    void setFlag(bool flag=true);signals:    void mySignal();public slots:private:    bool isStop;};#endif // MYTHREAD_H

mythread.cpp

#include "mythread.h"#include <QThread>#include <QDebug>myThread::myThread(QObject *parent) : QObject(parent){    isStop = false;}void myThread::myTimeout(){    while(isStop == false){        QThread::sleep(1);        emit mySignal();         qDebug()<<"子线程"<<QThread::currentThread();         if(isStop){             break;         }    }}void myThread::setFlag(bool flag){    isStop=flag;}

2.界面类

widget.h 声明qthread和mythread 变量

#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include "mythread.h"#include <QThread>namespace Ui {class Widget;}class Widget : public QWidget{    Q_OBJECTpublic:    explicit Widget(QWidget *parent = 0);    ~Widget();    void dealSignal();signals:    void startThread();private slots:    void on_start_clicked();    void on_stop_clicked();private:    Ui::Widget *ui;    myThread *myT;    QThread *thread;};#endif // WIDGET_H

widget.cpp

#include "widget.h"#include "ui_widget.h"#include<QDebug>Widget::Widget(QWidget *parent) :    QWidget(parent),    ui(new Ui::Widget){    ui->setupUi(this);    //动态分配空间,不能指定父对象    myT=new myThread;    //创建子线程    thread = new QThread(this);    //把自定义线程,加入到子线程中    myT->moveToThread(thread);    connect(myT, &myThread::mySignal, this ,&Widget::dealSignal);    qDebug()<<QThread::currentThread();    connect(this, &Widget::startThread, myT, &myThread::myTimeout);}Widget::~Widget(){    delete ui;}void Widget::dealSignal(){    static int i=0;    i++;    ui->lcdNumber->display(i);}void Widget::on_start_clicked(){    thread->start();    myT->setFlag(false);    //不能直接调用线程处理函数    //myT->myTimeout();    emit startThread();}void Widget::on_stop_clicked(){    myT->setFlag(true);    thread->quit();    thread->wait();}