• Qt多线程实现思路二


    1. 建立一个继承于Qobject的类myThread
    2. 在类myThread中定义线程处理函数不必是思路一里的run();
    3. 在窗口类中开辟一个自定义线程myThread的指针对象myT = new myThread;   
    4. thread = new QThread(this); //创建QThread类子线程
    5. myT->moveToThread(thread); 把自定义线程加入到子线程中
    6. 自定义线程中的线程任务就可以按照线程执行
    7. 这样建立的线程只能通过信号和槽的方式来调用
    8. 一般将任务写在while()里面,在线程退出时,会等待线程任务结束再退出
    9. 线程处理函数内部,不允许操作图形界面

    • mythread.h文件
     1 #ifndef MYTHREAD_H
     2 #define MYTHREAD_H
     3 #include <QThread>
     4 
     5 class myThread : public QObject
     6 {
     7     Q_OBJECT
     8 public:
     9     explicit myThread(QObject *parent = 0);
    10     //线程处理函数
    11     void myTimeout();
    12 
    13     void setFlag(bool flag = true);
    14 
    15 signals:
    16     void mySignal();
    17 
    18 public slots:
    19 
    20 private:
    21     bool isStop;
    22 };
    23 
    24 #endif // MYTHREAD_H
    • mythread.cpp文件
     1 #include "mythread.h"
     2 #include <QThread>
     3 #include <QDebug>
     4 
     5 
     6 myThread::myThread(QObject *parent) : QObject(parent)
     7 {
     8     isStop = false;
     9 }
    10 
    11 void myThread::myTimeout()
    12 {
    13     while( !isStop )
    14     {
    15 
    16         QThread::sleep(1);
    17         emit mySignal();
    18 
    19 
    20          qDebug() << "子线程号:" << QThread::currentThread();
    21 
    22          if(isStop)
    23          {
    24              break;
    25          }
    26     }
    27 }
    28 
    29 void myThread::setFlag(bool flag)
    30 {
    31     isStop = flag;
    32 }
    • widget.h文件
     1 #ifndef WIDGET_H
     2 #define WIDGET_H
     3 #include "mythread.h"
     4 #include <QWidget>
     5 #include <QTimer>
     6 #include <QThread>
     7 #include <QDebug>
     8 namespace Ui {
     9 class Widget;
    10 }
    11 
    12 class Widget : public QWidget
    13 {
    14     Q_OBJECT
    15 
    16 public:
    17     explicit Widget(QWidget *parent = 0);
    18     ~Widget();
    19     void dealSignal();
    20     void dealClose();
    21 
    22 signals:
    23     void startThread(); //启动子线程的信号
    24 
    25 private slots:
    26 
    27     void on_start_clicked();
    28 
    29     void on_stop_clicked();
    30 
    31 private:
    32     Ui::Widget *ui;
    33     myThread *myT;
    34     QThread *thread;
    35 };
    36 
    37 #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     myT = new myThread;//不能初始化指定父类myThread(this)
    10 
    11     //创建子线程
    12     thread = new QThread(this);
    13 
    14     //把自定义线程加入到子线程中
    15     myT->moveToThread(thread);
    16 
    17     connect(myT, &myThread::mySignal, this, &Widget::dealSignal);
    18 
    19     qDebug() << "主线程号:" << QThread::currentThread();
    20 
    21     connect(this, &Widget::startThread, myT, &myThread::myTimeout);
    22 
    23     //窗口关闭时调用线程关闭,前提是线程要运行完当前任务
    24     connect(this, &Widget::destroyed, this, &Widget::dealClose);
    25  
    30 }
    31 
    32 Widget::~Widget()
    33 {
    34     delete ui;
    35 }
    36 
    37 void Widget::dealClose()
    38 {
    39     on_stop_clicked();
    40     delete myT;
    41 }
    42 
    43 void Widget::dealSignal()
    44 {
    45     static int i = 0;
    46     i++;
    47     ui->lcdNumber->display(i);
    48 }
    49 
    50 void Widget::on_start_clicked()
    51 {
    52     if(thread->isRunning() == true)
    53     {
    54         return;
    55     }
    56 
    57     //启动线程,但是没有启动线程处理函数
    58     thread->start();
    59     myT->setFlag(false);
    60 
    61     //不能直接调用线程处理函数,
    62     //直接调用,导致,线程处理函数和主线程是在同一个线程
    63     //只能通过 signal - slot 方式调用
    64     emit startThread();
    65 }
    66 
    67 void Widget::on_stop_clicked()
    68 {
    69     if(thread->isRunning() == false)
    70     {
    71         return;
    72     }
    73 
    74     myT->setFlag(true);
    75     thread->quit();
    76     thread->wait();
    77 }
  • 相关阅读:
    事务
    数据库三大范式
    jdbc
    Jdbc事务
    Android 学习笔记2开发软件的常识&搭建开发环境(windows7)
    2011年起航
    Android 学习笔记3Android 工程目录介绍&程序执行过程
    我的第一篇日志基于AT89S52的单片机的LED点阵显示屏的设计
    算法基础之快速排序
    LeetCode88.合并两个有序数组
  • 原文地址:https://www.cnblogs.com/fuzhuoxin/p/12158488.html
Copyright © 2020-2023  润新知