QT多线程操作

家住魔仙堡 提交于 2020-01-22 13:47:38

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 }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!