Qt + 第一种线程

it2025-02-28  17

流程:

 

工程目录:

mythread.h:

#ifndef MYTHREAD_H #define MYTHREAD_H #include <QThread> class MyThread : public QThread { Q_OBJECT public: explicit MyThread(QObject *parent = 0); protected: //QThread的虚函数 可以查看QThread的 Protected Functions 部分 //线程处理函数 //不能直接调用,通过start()间接调用 void run(); signals: void isDone(); public slots: }; #endif // MYTHREAD_H

 

 

mywidget.h:

#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QTimer>//定时器头文件 #include "mythread.h" namespace Ui { class MyWidget; } class MyWidget : public QWidget { Q_OBJECT public: explicit MyWidget(QWidget *parent = 0); ~MyWidget(); void dealTimeout();//定时器槽函数 void dealDone();//线程结束槽函数 void stopThread();//停止线程槽函数 private slots: void on_pushButton_clicked(); private: Ui::MyWidget *ui; QTimer *myTimer;//声明变量 MyThread *thread;//线程对象 }; #endif // MYWIDGET_H

 

 

mythread.cpp:

 

#include "mythread.h" MyThread::MyThread(QObject *parent) : QThread(parent) { } void MyThread::run() { //很复杂的数据处理 //需要耗时 5 s sleep(5); emit isDone(); }

 

 

 

mywidget.cpp:

#include "mywidget.h" #include "ui_mywidget.h" /* * 当数据处理复杂的时候,就要考虑使用多线程的方式,防止程序出现“无响应”而崩溃 */ #include <QThread> //当使用sleep时需要使用此头文件 #include <QDebug> MyWidget::MyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MyWidget) { ui->setupUi(this); myTimer = new QTimer(this); //只要定时器启动,自动触发timeout() connect(myTimer,&QTimer::timeout,this,&MyWidget::dealTimeout); //分配空间 thread = new MyThread(this); //在多线程中的槽函数中,尽量使用传统的槽函数,而不使用lambda connect(thread,&MyThread::isDone,this,&MyWidget::dealDone); //在运行结束的时候,将线程关闭,当按窗口右上角的叉时,窗口触发destroyed() connect(this,&MyWidget::destroyed,this,&MyWidget::stopThread); } void MyWidget::stopThread() { //停止线程 不建议使用terminate()停止线程的函数,这个函数太暴力,当线程中使用指针的时候,使用容易造成内存错误 thread->quit(); //等待线程处理完手头工作 thread->wait(); } void MyWidget::dealDone() { qDebug()<<"it is over !!"; myTimer->stop();//关闭定时器 } void MyWidget::dealTimeout() { static int i = 0; i++; //设置LCD的值 ui->lcdNumber->display(i); } MyWidget::~MyWidget() { delete ui; } void MyWidget::on_pushButton_clicked() { //当点击了按钮后,定时器没有工作时执行 if (false == myTimer->isActive()) { myTimer->start(100); } // //定时器启动后,当这里有非常复杂的数据处理 非常耗时的情况时 // //这里使用sleep函数代表这里程序复杂、运行的时间长 // QThread::sleep(5); // //处理完数据后,关闭定时器 // myTimer->stop(); // qDebug()<<"over"; //启动线程,处理数据 thread->start(); }

 

 

ui:

 

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

最新回复(0)