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

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

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

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

CONFIG+=thread

Qt学习之如何启动和终止一个线程的更多相关文章

  1. 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ---干净的终止一个线程

    干净的终止一个线程  我曾经在第2章产生一个后台线程,用以输出一张屏幕外的 bitmap 图.我们必须解决的一个最复杂的问题就是,如果用户企图结束程序,而这张bitmap 图尚未完成,怎么办?第2章的 ...

  2. JavaWeb 服务启动时,在后台启动加载一个线程

    JavaWeb 服务启动时,在后台启动加载一个线程. 目前,我所掌握的一共有两种方法,第一种是监听(Listener),第二种是配置随项目启动而启动的Servlet. 下面对这两种方法做一简单的介绍, ...

  3. Android立刻终止一个线程

    /** * Created by JuTao on 2017/2/4. * 如何中止一个线程 */ public class ThreadDone { public static void main( ...

  4. java中怎么终止一个线程的执行----个人学习心得

    参考了一下两个网站的介绍: ①:http://blog.csdn.net/liuhanhan512/article/details/7077601 ②:http://www.blogjava.net/ ...

  5. Java线程(学习整理)--2---加入另一个线程join

    1.join简介: 今天刚学的,这里我简单总结一下,join本身就是“加入”的意思,那么在线程中是什么意思呢?是在一个线程的run方法执行过程中,当特殊情况下需要执行一些其他的操作的时候,我们会用到j ...

  6. C# 启动和结束一个线程

    在程序执行中会遇到启动本软件的exe问,或者启用其它的exe文件,已达到执行某些操作的作用.下面是两种最常见的启动exe文件. 1.调用系统dll使用其提供的方法. 引用的dll, [DllImpor ...

  7. 在Java中如何正确地终止一个线程

    1.使用Thread.stop()? 极力不推荐此方式,此函数不安全且已废弃,具体可参考Java API文档 2.设置终止标识,例如: import static java.lang.System.o ...

  8. 安全终止MFC线程

    终止线程 有两种情况可以使线程结束:控制函数结束或者根本就不允许线程完成,而提前终止它.我们可以想象在WORD中进行后台打印,如果打印结束了,那线程就可以结束了.如果用户中止了打印,那后台打印线程也要 ...

  9. Java基础学习总结(68)——有关Java线程方面的面试题

    不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java 语言一个重要的特点就是内置了对并发的支持,让 Java 大受企业和程序员的欢迎.大多数待遇丰厚的 Java 开发职位都要求开发者 ...

随机推荐

  1. mpvue + 微信小程序 picker 实现自定义多级联动 超简洁

    微信小程序官网只提供了省市区的三级联动,实际开发中更多的是自定义的多级联动: 依照微信小程序官网提供的自定义多级联动,需要使用到picker 的多列选择器,即设置 mode = multiSelect ...

  2. python中括号知识点

    Python语言中括号分为几个类型,常见的三个圆括号是圆括号().中间圆括号[]和大括号.它的函数也不同,代表不同的Python基本内置数据类型. python括号 python()中的括号:表示tu ...

  3. 如何部署struts开发环境

    1 首先登陆http://archive.apache.org/dist/struts/source/页面,会看到struts的下载页面 2 下载struts的最新版本struts2-2.2.1-sr ...

  4. oracle数据库(实例)的导出与导入

    Oracle数据导入导出常用两种方式: 1.是通过plsql-->tool-->export/import进行dmp文件的导入与导出: 2.使用命令imp/exp执行oracle数据导入与 ...

  5. Linux环境下MySql安装和常见问题的解决

    MySql安装 首先当然是要连接上linux服务器咯,然后就是下面的命令甩过去,梭哈,一通运行就是啦   梭哈 下载: sudo wget http://dev.mysql.com/get/mysql ...

  6. S/4HANA中的销售计划管理

    大家好,我所在的S/4HANA Sales(SD)成都研发团队,主要负责S/4HANA里销售模块相关的标准产品研发. 作为产品研发团队,我们遵循SCRUM迭代式增量软件开发过程,以两个星期为一个迭代, ...

  7. 5. First-Class Functions

    Function in python are first-class objects (runtime / element / argument / return) 1. Treating a Fun ...

  8. idou老师带教你学Istio 03: istio故障注入功能的介绍和使用

    故障注入测试 故障注入测试顾名思义就是当被测试应用部分组件或功能出现潜在故障时其本身的容错机制是否正常工作,以达到规避故障保证正常组件或功能的使用.Istio提供了HTTP故障注入功能,在http请求 ...

  9. mysqll中索引详细讲解

    MySQL(五) MySQL中的索引详讲   序言 之前写到MySQL对表的增删改查(查询最为重要)后,就感觉MySQL就差不多学完了,没有想继续学下去的心态了,原因可能是由于别人的影响,觉得对于My ...

  10. Java错误和异常解析

    Java错误和异常解析 错误和异常 在Java中, 根据错误性质将运行错误分为两类: 错误和异常. 在Java程序的执行过程中, 如果出现了异常事件, 就会生成一个异常对象. 生成的异常对象将传递Ja ...