• Qt多线程实现思路一


      实现一个线程开启时,时间计时器任然能够计数,两路独立工作的线程功能。从类的帮助文件中可以看到如下信息,静态公共成员函数和保护类型的函数,在静态函数中有睡眠函数msleep毫秒级,sleep秒级,usleep微秒级。保护函数中有run虚函数,说明使用时可以重新定义,发生多态,为实现线程任务的关键函数。实现效果如下;在定时器计数时线程的run函数在执行一个5秒的睡眠功能。同步进行

     

    mythread.h文件

     1 #ifndef MYTHREAD_H
     2 #define MYTHREAD_H
     3 #include <QThread>
     4 
     5 class myThread : public QThread
     6 {
     7     Q_OBJECT
     8 public:
     9     explicit myThread(QObject *parent = 0);
    10 
    11 protected:
    12     void run();//线程任务在基类QThread为虚函数,从类QThread中继承并重新定义,发生多态
    13 signals:
    14     void isDone();
    15 };
    16 
    17 #endif // MYTHREAD_H

    mythread.cpp文件

     1 #include "mythread.h"
     2 
     3 
     4 myThread::myThread(QObject *parent) : QThread(parent)
     5 {
     6 
     7 }
     8 void myThread::run()
     9 {
    10     sleep(5);//线程任务为休眠5秒
    11 emit isDone();//休眠5秒结束后触发一个完成信号
    12 }
    widget.h文件
     1 #ifndef WIDGET_H
     2 #define WIDGET_H
     3 #include "mythread.h"
     4 #include <QWidget>
     5 #include <QTimer>
     6 namespace Ui {
     7 class Widget;
     8 }
     9 
    10 class Widget : public QWidget
    11 {
    12     Q_OBJECT
    13 
    14 public:
    15     explicit Widget(QWidget *parent = 0);
    16     ~Widget();
    17     void dealTimeout();//计时器触发信号
    18 private slots:
    19     void on_pushButton_clicked();//按钮槽函数
    20     void dealDone(); //线程结束槽函数
    21     void stopThread(); //停止线程槽函数
    22 private:
    23     Ui::Widget *ui;
    24     QTimer *myTimer;//建一个时间类型的对象指针
    25     myThread *MYt;//建一个线程类型的对象指针
    26 };
    27 
    28 #endif // WIDGET_H
    widget.cpp文件
     1 #include "widget.h"
     2 #include "ui_widget.h"
     3 #include "mythread.h"
     4 Widget::Widget(QWidget *parent) :
     5     QWidget(parent),
     6     ui(new Ui::Widget)
     7 {
     8     ui->setupUi(this);
     9     myTimer = new QTimer(this);
    10     MYt = new myThread(this);
    11     connect(myTimer,&QTimer::timeout,this,&Widget::dealTimeout);
    //每隔100ms执行的动作 12 connect(MYt,&myThread::isDone,this,&Widget::dealDone);
    //线程第二步,当线程完成时,触发线程完成信号 13 connect(this,&Widget::destroyed,this,&Widget::stopThread);
    //线程第三步,当窗口关闭时,停止线程 14 } 15 void Widget::dealDone() 16 { 17 myTimer->stop();//计时停止 18 } 19 void Widget::stopThread() 20 { 21 MYt->quit(); 22 MYt->wait(); 23 delete MYt;//释放内存 24 } 25 void Widget::dealTimeout() 26 { 27 static int i = 0; 28 i++; 29 ui->lcdNumber->display(i);//数码管显示当前计数 30 } 31 Widget::~Widget() 32 { 33 delete ui; 34 } 35 36 void Widget::on_pushButton_clicked() 37 { 38 if(myTimer->isActive()==false) 39 { 40 myTimer->start(100);//按下按钮,时间没有开始计时则激活开始计时 41 } 42 MYt->start();//按下按钮启动线程为第一步 43 }
     
  • 相关阅读:
    AcWing 171. 送礼物
    AcWing 167. 木棒
    AcWing 166. 数独
    AcWing 168. 生日蛋糕
    AcWing 180 排书
    A*与IDA* 算法介绍
    AcWing 170. 加成序列[曾用名:加法链]
    AcWing 普通队列与循环队列写法
    AcWing 181. 回转游戏
    AcWing 1129. 热浪【单源最短路】
  • 原文地址:https://www.cnblogs.com/fuzhuoxin/p/12157724.html
Copyright © 2020-2023  润新知