QT 多线程处理和使用

思路:

QT 多线程处理和使用


项目实例:

QT 多线程处理和使用  QT 多线程处理和使用       QT 多线程处理和使用



源码交流:

mythread.h

[html] view plain copy
  1. #ifndef MYTHREAD_H  
  2. #define MYTHREAD_H  
  3.   
  4. #include <QObject>  
  5. #include <QThread>  
  6. #include <QDebug>  
  7.   
  8. class MyThread : public QObject  
  9. {  
  10.     Q_OBJECT  
  11. public:  
  12.     explicit MyThread(QObject *parent = 0);  
  13.   
  14.     void MyTimeout();//线程处理函数  
  15.     void setFlage(bool flag = true);  //设置标志位,何时关闭子线程  
  16.   
  17. signals:  
  18.     void MySignal();  
  19.   
  20. public slots:  
  21.   
  22.   
  23. protected:  
  24.     bool isStop;  
  25. };  
  26.   
  27. #endif // MYTHREAD_H  


mythread.cpp

[html] view plain copy
  1. #include "mythread.h"  
  2.   
  3. MyThread::MyThread(QObject *parent) : QObject(parent)  
  4. {  
  5.     isStop = false;  
  6. }  
  7.   
  8. //线程处理函数  
  9. void MyThread::MyTimeout()  
  10. {  
  11.     while(false == isStop)  
  12.     {  
  13.         QThread::sleep(1);  
  14.   
  15.         emit MySignal();   //每隔一秒发射一次信号  
  16.         qDebug()<<"子线程ID:"<<QThread::currentThread();  //显示当前线程的数值  
  17.   
  18.         if(true == isStop)  
  19.         {  
  20.             break;  
  21.         }  
  22.     }  
  23. }  
  24.   
  25. void MyThread::setFlage(bool flag)  
  26. {  
  27.     isStop = flag;  
  28. }  

mywidget.h

[html] view plain copy
  1. #ifndef MYWIDGET_H  
  2. #define MYWIDGET_H  
  3.   
  4. #include <QWidget>  
  5. #include "mythread.h"  
  6. #include <QThread>  
  7. #include <QDebug>  
  8.   
  9. namespace Ui {  
  10. class MyWidget;  
  11. }  
  12.   
  13. class MyWidget : public QWidget  
  14. {  
  15.     Q_OBJECT  
  16.   
  17. public:  
  18.     explicit MyWidget(QWidget *parent = 0);  
  19.     ~MyWidget();  
  20.   
  21.     void dealMySignal();  
  22.   
  23. private slots:  
  24.     void on_pushButton_clicked();  
  25.   
  26.     void on_pushButton_2_clicked();  
  27.   
  28.     void dealClose();  
  29.   
  30. signals:  
  31.     void startMyThread();  //启动子线程的信号  
  32.   
  33. private:  
  34.     Ui::MyWidget *ui;  
  35.   
  36.     MyThread *myThread;  
  37.     QThread *thread;  
  38. };  
  39.   
  40. #endif // MYWIDGET_H  

mywidget.cpp

[html] view plain copy
  1. #include "mywidget.h"  
  2. #include "ui_mywidget.h"  
  3.   
  4. MyWidget::MyWidget(QWidget *parent) :  
  5.     QWidget(parent),  
  6.     ui(new Ui::MyWidget)  
  7. {  
  8.     ui->setupUi(this);  
  9.   
  10.     //创建线程对象,不能够指定父对象  
  11.     myThread = new MyThread;  
  12.     //创建子线程对象  
  13.     thread = new QThread(this);  
  14.     //把子线程(对象)添加到自定义的线程类(对象)中  
  15.     myThread->moveToThread(thread);  
  16.   
  17.     connect(myThread, &MyThread::MySignal, this, &MyWidget::dealMySignal);  
  18.     qDebug()<<"主线程ID:"<<QThread::currentThread();  //显示当前线程的数值  
  19.   
  20.     connect(this, &MyWidget::startMyThread, myThread, &MyThread::MyTimeout);  
  21.   
  22.     connect(this, &MyWidget::destroyed, this, &MyWidget::dealClose);  
  23.   
  24.   
  25.     //线程处理函数内部,不允许操作图形界面  
  26.   
  27.     //connect()第五个参数的作用, 连接方式: 默认, 队列,直接  
  28.     //多线程才有含义  
  29.     //默认的时候  
  30.     //如果是多线程,默认使用队列  
  31.     //如果是单线程,默认使用直接方式  
  32.     //队列:槽函数所在线程和接受(信号)者一样  
  33.     //直接:槽函数所在线程和发送(信号)者一样  
  34.   
  35.   
  36.   
  37. }  
  38.   
  39. MyWidget::~MyWidget()  
  40. {  
  41.     delete ui;  
  42. }  
  43.   
  44. //处理收到的线程的信号, 作出相应动作  
  45. void MyWidget::dealMySignal()  
  46. {  
  47.     static int i = 0;  
  48.     i++;  
  49.     ui->lcdNumber->display(i);  
  50. }  
  51.   
  52.   
  53. //启动子线程  
  54. void MyWidget::on_pushButton_clicked()  
  55. {  
  56.   
  57.     if(thread->isRunning() == true)  //这个判断个什么鬼?  
  58.     {  
  59.         return;  
  60.     }  
  61.     //启动子线程,但没有启动线程处理函数  
  62.     thread->start();  
  63.     myThread->setFlage(false);  
  64.   
  65.     //**************************************************  
  66.     //不能够直接调用该线程处理函数  
  67.     //不然的话,都会导致线程处理函数和主线程是在同一个线程  
  68.     // myThread->MyTimeout();  
  69.     //**************************************************  
  70.   
  71.   
  72.     //只能够通过 signal - slot 来调用线程处理函数  
  73.     emit startMyThread();  
  74.   
  75.   
  76.   
  77. }  
  78.   
  79. void MyWidget::on_pushButton_2_clicked()  
  80. {  
  81.     if(thread->isRunning() == false)  
  82.     {  
  83.         return;  
  84.     }  
  85.     myThread->setFlage(true);  
  86.     thread->quit();  
  87.     thread->wait();  
  88. }  
  89.   
  90. void MyWidget::dealClose()  
  91. {  
  92.     on_pushButton_2_clicked();  
  93.     delete myThread;  //因为没有指定父对象,所以不释放会溢出,但是没有设么大问题  
  94. }