Qt + 第一种线程

女爷i 2021-11-11 01:06 273阅读 0赞

流程:

1332400-20190710110242778-371701262.png

工程目录:

1332400-20190710110304368-616669425.png

mythread.h:

  1. #ifndef MYTHREAD_H
  2. #define MYTHREAD_H
  3. #include <QThread>
  4. class MyThread : public QThread
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit MyThread(QObject *parent = 0);
  9. protected:
  10. //QThread的虚函数 可以查看QThread的 Protected Functions 部分
  11. //线程处理函数
  12. //不能直接调用,通过start()间接调用
  13. void run();
  14. signals:
  15. void isDone();
  16. public slots:
  17. };
  18. #endif // MYTHREAD_H

mywidget.h:

  1. #ifndef MYWIDGET_H
  2. #define MYWIDGET_H
  3. #include <QWidget>
  4. #include <QTimer>//定时器头文件
  5. #include "mythread.h"
  6. namespace Ui {
  7. class MyWidget;
  8. }
  9. class MyWidget : public QWidget
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit MyWidget(QWidget *parent = 0);
  14. ~MyWidget();
  15. void dealTimeout();//定时器槽函数
  16. void dealDone();//线程结束槽函数
  17. void stopThread();//停止线程槽函数
  18. private slots:
  19. void on_pushButton_clicked();
  20. private:
  21. Ui::MyWidget *ui;
  22. QTimer *myTimer;//声明变量
  23. MyThread *thread;//线程对象
  24. };
  25. #endif // MYWIDGET_H

mythread.cpp:

  1. #include "mythread.h"
  2. MyThread::MyThread(QObject *parent) : QThread(parent)
  3. {
  4. }
  5. void MyThread::run()
  6. {
  7. //很复杂的数据处理
  8. //需要耗时 5 s
  9. sleep(5);
  10. emit isDone();
  11. }

mywidget.cpp:

  1. #include "mywidget.h"
  2. #include "ui_mywidget.h"
  3. /*
  4. * 当数据处理复杂的时候,就要考虑使用多线程的方式,防止程序出现“无响应”而崩溃
  5. */
  6. #include <QThread> //当使用sleep时需要使用此头文件
  7. #include <QDebug>
  8. MyWidget::MyWidget(QWidget *parent) :
  9. QWidget(parent),
  10. ui(new Ui::MyWidget)
  11. {
  12. ui->setupUi(this);
  13. myTimer = new QTimer(this);
  14. //只要定时器启动,自动触发timeout()
  15. connect(myTimer,&QTimer::timeout,this,&MyWidget::dealTimeout);
  16. //分配空间
  17. thread = new MyThread(this);
  18. //在多线程中的槽函数中,尽量使用传统的槽函数,而不使用lambda
  19. connect(thread,&MyThread::isDone,this,&MyWidget::dealDone);
  20. //在运行结束的时候,将线程关闭,当按窗口右上角的叉时,窗口触发destroyed()
  21. connect(this,&MyWidget::destroyed,this,&MyWidget::stopThread);
  22. }
  23. void MyWidget::stopThread()
  24. {
  25. //停止线程 不建议使用terminate()停止线程的函数,这个函数太暴力,当线程中使用指针的时候,使用容易造成内存错误
  26. thread->quit();
  27. //等待线程处理完手头工作
  28. thread->wait();
  29. }
  30. void MyWidget::dealDone()
  31. {
  32. qDebug()<<"it is over !!";
  33. myTimer->stop();//关闭定时器
  34. }
  35. void MyWidget::dealTimeout()
  36. {
  37. static int i = 0;
  38. i++;
  39. //设置LCD的值
  40. ui->lcdNumber->display(i);
  41. }
  42. MyWidget::~MyWidget()
  43. {
  44. delete ui;
  45. }
  46. void MyWidget::on_pushButton_clicked()
  47. {
  48. //当点击了按钮后,定时器没有工作时执行
  49. if (false == myTimer->isActive())
  50. {
  51. myTimer->start(100);
  52. }
  53. // //定时器启动后,当这里有非常复杂的数据处理 非常耗时的情况时
  54. // //这里使用sleep函数代表这里程序复杂、运行的时间长
  55. // QThread::sleep(5);
  56. // //处理完数据后,关闭定时器
  57. // myTimer->stop();
  58. // qDebug()<<"over";
  59. //启动线程,处理数据
  60. thread->start();
  61. }

ui:

1332400-20190710110513198-626333376.png

转载于:https://www.cnblogs.com/doker/p/11162586.html

发表评论

表情:
评论列表 (有 0 条评论,273人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Qt线基础

    Qt线程基础 Qt是一个功能强大的跨平台应用程序框架,它提供了丰富的多线程支持,使得在Qt应用程序中使用多线程变得简单和高效。在本文中,我们将介绍Qt中的线程基础知识,并提供

    相关 Qt:同步线

    尽管线程的目的是允许代码并行运行,但有时线程必须停止并等待其他线程。比如,如果两个线程 尝试同时写入同一个变量,则结果是不确定的。强制线程相互等待的原理称为互斥。这是保护共享资

    相关 QT线同步

    线程同步 虽然线程的目的是允许代码并行运行,但有时线程必须停止并等待其他线程。例如,如果两个线程试图同时写入同一个变量,结果是未定义的。强制线程彼此等待的原则称为互斥。它是

    相关 Qt线

    今天学习Qt的多线程,在学习多线程主要是两个方面。一是多线程的基础概念,二是多线程的同步,三是怎么和主线程进行通讯。 三.Qt 的应用程序开始执行的时候,只有一个主线程在运行

    相关 QT线

    QT多线程,QT4.7之前是承继 QThread 的方式,比较简单,而 QT5之后,使用了信号和槽的方式,比较灵活。(版本信息可能有误) 下面是对QT线程信息的注意事项