QT的线程开启方式有俩种方法
方法一:
1.派生QThread类,重写父类的run函数.派生对象调用strat()函数;
二方法:
1.派生出一个QObject的子类,再创建一个QThread对象;
2.把需要在线程运行的函数写在QObject的子类的槽中;
3通过QObject的子类的对象moveToThread()移动到线程对象中去;
4.连接connect(线程对象,SIGNAL(strated()),QObject派生类对象,SLOT(func()));
5.线程对象调用strat()函数;
官网推荐第二种方法开启线程,这里需要注意的是一个QThread类的派生对象就是一条线程,当线程调用strat()函数,默认调用了run()函数,run函数又底层调用了exec()事件循环;
所以线程内函数运行结束了,需要回收资源的话,需要先调用quit()函数退出事件循环,再调用wait()来回收线程资源;
注:QObject派生类对象如果槽函数是死循环需要设置一个flag来终止,对象的资源回收需要线程来完成deleteLater(),不可以设置父类托管内存,因为该对象已经不在主线程中了;
示例:
新建一个窗口类,放入俩个LCD控件,一个按钮控件;
widget.h
1 #ifndef WIDGET_H 2 #define WIDGET_H 3 4 #include <QWidget> 5 #include <QThread> 6 7 namespace Ui { 8 class Widget; 9 } 10 11 class myThread; 12 class Widget : public QWidget 13 { 14 Q_OBJECT 15 16 public: 17 explicit Widget(QWidget *parent = nullptr); 18 ~Widget(); 19 20 private: 21 Ui::Widget *ui; 22 myThread* _run; 23 myThread* _run1; 24 QThread* _thread; 25 QThread* _thread1; 26 }; 27 28 #endif // WIDGET_H
wdiget.cpp
1 #include "widget.h" 2 #include "ui_widget.h" 3 #include "mythread.h" 4 #include <QThread> 5 #include <QDebug> 6 7 8 Widget::Widget(QWidget *parent) : 9 QWidget(parent), 10 ui(new Ui::Widget) 11 { 12 ui->setupUi(this); 13 _run = new myThread; 14 _run->_lcd1 = ui->lcdNumber; 15 16 _run1 = new myThread; 17 _run1->_lcd2 = ui->lcdNumber_2; 18 19 _thread = new QThread(this); 20 _run->moveToThread(_thread); 21 22 _thread1 = new QThread(this); 23 _run1->moveToThread(_thread1); 24 25 connect(ui->start,SIGNAL(clicked()),_run,SLOT(count_1())); 26 connect(ui->start,SIGNAL(clicked()),_run1,SLOT(count_2())); 27 28 connect(_thread,SIGNAL(finished()),_run,SLOT(deleteLater())); 29 connect(_thread1,SIGNAL(finished()),_run1,SLOT(deleteLater())); 30 _thread->start(); 31 _thread1->start(); 32 } 33 34 Widget::~Widget() 35 { 36 _run->_flag = false; 37 _run1->_flag = false; 38 qDebug() << __func__; 39 delete ui; 40 _thread->quit(); 41 _thread1->quit(); 42 _thread->wait(); 43 _thread1->wait(); 44 }
mythread.h
1 #ifndef MYTHREAD_H 2 #define MYTHREAD_H 3 4 #include <QObject> 5 #include <QLCDNumber> 6 7 class myThread : public QObject 8 { 9 Q_OBJECT 10 public: 11 explicit myThread(QObject *parent = nullptr); 12 ~myThread(); 13 14 signals: 15 16 public slots: 17 void count_1(); 18 void count_2(); 19 public: 20 QLCDNumber* _lcd1; 21 QLCDNumber* _lcd2; 22 bool _flag = true; 23 }; 24 25 #endif // MYTHREAD_H
mythread.cpp
1 #include "mythread.h" 2 #include "ui_widget.h" 3 #include <QThread> 4 #include <QDebug> 5 6 myThread::myThread(QObject *parent) : QObject(parent) 7 { 8 9 } 10 11 myThread::~myThread() 12 { 13 qDebug() << __func__; 14 } 15 16 void myThread::count_1() 17 { 18 int i = 0; 19 while (_flag) 20 { 21 i++; 22 _lcd1->display(i); 23 QThread::msleep(500); 24 qDebug() << i; 25 } 26 } 27 28 void myThread::count_2() 29 { 30 int i = 0; 31 while (_flag) 32 { 33 i++; 34 _lcd2->display(i); 35 QThread::msleep(1000); 36 //qDebug() << i; 37 } 38 }
来源:https://www.cnblogs.com/mtn007/p/12228415.html