zoukankan      html  css  js  c++  java
  • Qt学习之如何启动和终止一个线程

    先来给出每个文件的相关代码然后再加以分析

    Cpp代码  收藏代码
    1. //*************dialog.h**************//  
    2.   
    3.    
    4. #ifndef DIALOG_H  
    5. #define DIALOG_H  
    6. #include <QDialog>  
    7. #define MAXSIZE 5  //最大的线程数  
    8. class QDialogButtonBox;  
    9. class QProgressBar;  
    10. class QPushButton;  
    11. class WorkThread;  
    12. class ThreadDlg : public QDialog  
    13. {  
    14.     Q_OBJECT  
    15. public:  
    16.     ThreadDlg(QWidget *parent = 0);  
    17. public slots:  
    18.         void start();     
    19.         void stop();  
    20. private:  
    21.     QPushButton *startButton;  
    22.     QPushButton *quitButton;  
    23.     QPushButton *stopButton;  
    24.     QDialogButtonBox *buttonBox;  
    25.         WorkThread* threadVector[MAXSIZE];  
    26. };  
    27. #endif  
    28. //***********end end end************//  
    Cpp代码  收藏代码
    1. //***********mainwindow.h************//  
    2.   
    3.    
    4. #ifndef WORKTHREAD_H  
    5. #define WORKTHREAD_H  
    6. #include <QThread>  
    7. class WorkThread : public QThread  
    8. {  
    9.  protected:  
    10.      void run();   //重新实现run()函数  
    11. };  
    12.    
    13. #endif  
    14. //***********end end end************//  

     

    Cpp代码  收藏代码
    1. //***********dialog.cpp************//  
    2.   
    3.    
    4. #include <QtGui>  
    5. #include "workThread.h"  
    6. #include "dialog.h"  
    7.       
    8. ThreadDlg::ThreadDlg(QWidget *parent)       
    9.     : QDialog(parent)  
    10. {  
    11.     startButton = new QPushButton(tr("开始"));  
    12.     quitButton = new QPushButton(tr("退出"));  
    13.         stopButton = new QPushButton(tr("停止"));  
    14.         stopButton->setEnabled(false);  
    15.     buttonBox = new QDialogButtonBox;  
    16.     buttonBox->addButton(startButton, QDialogButtonBox::ActionRole);  
    17.         buttonBox->addButton(stopButton, QDialogButtonBox::ActionRole);  
    18.     buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);  
    19.     connect(startButton, SIGNAL(clicked()), this, SLOT(start()));  
    20.     connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));  
    21.     connect(stopButton, SIGNAL(clicked()), this, SLOT(stop()));  
    22.     QVBoxLayout *mainLayout = new QVBoxLayout;  
    23.     mainLayout->addWidget(buttonBox);  
    24.     setLayout(mainLayout);  
    25.     setWindowTitle(tr("启动线程"));  
    26. }  
    27. void ThreadDlg::start()  
    28. {  
    29.     for(int i=0;i<MAXSIZE;i++)  
    30.     {  
    31.         threadVector[i] = new WorkThread();   //创建线程  
    32.     }  
    33.       
    34.         for(int i=0;i<MAXSIZE;i++)  
    35.     {  
    36.         threadVector[i]->start(QThread::LowestPriority);   //启动线程同时设置它的优先级,当然也可以不带,使用默认的优先级  
    37.     }  
    38.     stopButton->setEnabled(true);  
    39.     startButton->setEnabled(false);  
    40. }  
    41. void ThreadDlg::stop()  
    42. {  
    43.     for(int i=0;i<MAXSIZE;i++)  
    44.     {  
    45.         threadVector[i]->terminate();    //终止线程  
    46.         threadVector[i]->wait();    //阻塞等待  
    47.     }  
    48.     startButton->setEnabled(true);  
    49.     stopButton->setEnabled(false);  
    50. }  
    51. //***********end end end************//  
    Cpp代码  收藏代码
    1. //***********mainwindow.cpp************//  
    2.   
    3.    
    4.    
    5. #include "workThread.h"  
    6. #include "dialog.h"  
    7. #include <QTextEdit>  
    8. #include <QDebug>  
    9. #include <stdio.h>  
    10.  void WorkThread::run()  
    11.  {  
    12.      while(true)  
    13.          for (int n = 0; n < 10;++n) {  
    14.                     printf("%d ",n);  //打印输出  
    15.      }  
    16.  }  
    17.    
    18. //***********end end end************//  
    19.   
    20. //***********main.cpp************//  
    21.   
    22.    
    23. #include <QApplication>  
    24. #include <QtCore>  
    25. #include "dialog.h"  
    26. int main(int argc, char *argv[])  
    27. {  
    28.     QApplication app(argc, argv);  
    29.     QTextCodec::setCodecForTr( QTextCodec::codecForName("gb2312"));   
    30.     ThreadDlg dialog;  
    31.     dialog.show();  
    32.     return dialog.exec();  
    33. }  
    34. //***********end end end************//  

    以上代码简单,没有必要做过多的讲解,但是其中的“threadVector[i]->terminate(); ”有必要讲解下,terminate()函数的调用便不会立刻终止线程,因为线程的何时终止取决于系统的调度策略,所在在之后又调用了wait()函数是线程阻塞等待直到退出或者超时。

    最后加以一点就是在.pro文件中加入一行代码才能成功运行:

    CONFIG+=thread

  • 相关阅读:
    【原创】C# 文件操作详解(三)Directory类
    【原创】C# 文件操作详解(一)File类
    【原创】VS使用技巧——工欲善其事必先利其器
    【原创】C# 文件操作详解(四)DirectoryInfo类
    strpos用法
    调试跳转动态打印
    解决DIV超出样式长度自动换行
    PHP时间戳常用转换在(大、小月问题)
    懒人JS
    PHP 快速排序 与二维数组排序
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3758139.html
Copyright © 2011-2022 走看看