Qt学习之如何启动和终止一个线程
先来给出每个文件的相关代码然后再加以分析
- //*************dialog.h**************//
- #ifndef DIALOG_H
- #define DIALOG_H
- #include <QDialog>
- #define MAXSIZE 5 //最大的线程数
- class QDialogButtonBox;
- class QProgressBar;
- class QPushButton;
- class WorkThread;
- class ThreadDlg : public QDialog
- {
- Q_OBJECT
- public:
- ThreadDlg(QWidget *parent = 0);
- public slots:
- void start();
- void stop();
- private:
- QPushButton *startButton;
- QPushButton *quitButton;
- QPushButton *stopButton;
- QDialogButtonBox *buttonBox;
- WorkThread* threadVector[MAXSIZE];
- };
- #endif
- //***********end end end************//
- //***********mainwindow.h************//
- #ifndef WORKTHREAD_H
- #define WORKTHREAD_H
- #include <QThread>
- class WorkThread : public QThread
- {
- protected:
- void run(); //重新实现run()函数
- };
- #endif
- //***********end end end************//
- //***********dialog.cpp************//
- #include <QtGui>
- #include "workThread.h"
- #include "dialog.h"
- ThreadDlg::ThreadDlg(QWidget *parent)
- : QDialog(parent)
- {
- startButton = new QPushButton(tr("开始"));
- quitButton = new QPushButton(tr("退出"));
- stopButton = new QPushButton(tr("停止"));
- stopButton->setEnabled(false);
- buttonBox = new QDialogButtonBox;
- buttonBox->addButton(startButton, QDialogButtonBox::ActionRole);
- buttonBox->addButton(stopButton, QDialogButtonBox::ActionRole);
- buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);
- connect(startButton, SIGNAL(clicked()), this, SLOT(start()));
- connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
- connect(stopButton, SIGNAL(clicked()), this, SLOT(stop()));
- QVBoxLayout *mainLayout = new QVBoxLayout;
- mainLayout->addWidget(buttonBox);
- setLayout(mainLayout);
- setWindowTitle(tr("启动线程"));
- }
- void ThreadDlg::start()
- {
- for(int i=0;i<MAXSIZE;i++)
- {
- threadVector[i] = new WorkThread(); //创建线程
- }
- for(int i=0;i<MAXSIZE;i++)
- {
- threadVector[i]->start(QThread::LowestPriority); //启动线程同时设置它的优先级,当然也可以不带,使用默认的优先级
- }
- stopButton->setEnabled(true);
- startButton->setEnabled(false);
- }
- void ThreadDlg::stop()
- {
- for(int i=0;i<MAXSIZE;i++)
- {
- threadVector[i]->terminate(); //终止线程
- threadVector[i]->wait(); //阻塞等待
- }
- startButton->setEnabled(true);
- stopButton->setEnabled(false);
- }
- //***********end end end************//
- //***********mainwindow.cpp************//
- #include "workThread.h"
- #include "dialog.h"
- #include <QTextEdit>
- #include <QDebug>
- #include <stdio.h>
- void WorkThread::run()
- {
- while(true)
- for (int n = 0; n < 10;++n) {
- printf("%d\n",n); //打印输出
- }
- }
- //***********end end end************//
- //***********main.cpp************//
- #include <QApplication>
- #include <QtCore>
- #include "dialog.h"
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- QTextCodec::setCodecForTr( QTextCodec::codecForName("gb2312"));
- ThreadDlg dialog;
- dialog.show();
- return dialog.exec();
- }
- //***********end end end************//
以上代码简单,没有必要做过多的讲解,但是其中的“threadVector[i]->terminate(); ”有必要讲解下,terminate()函数的调用便不会立刻终止线程,因为线程的何时终止取决于系统的调度策略,所在在之后又调用了wait()函数是线程阻塞等待直到退出或者超时。
最后加以一点就是在.pro文件中加入一行代码才能成功运行:
CONFIG+=thread
Qt学习之如何启动和终止一个线程的更多相关文章
- 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ---干净的终止一个线程
干净的终止一个线程 我曾经在第2章产生一个后台线程,用以输出一张屏幕外的 bitmap 图.我们必须解决的一个最复杂的问题就是,如果用户企图结束程序,而这张bitmap 图尚未完成,怎么办?第2章的 ...
- JavaWeb 服务启动时,在后台启动加载一个线程
JavaWeb 服务启动时,在后台启动加载一个线程. 目前,我所掌握的一共有两种方法,第一种是监听(Listener),第二种是配置随项目启动而启动的Servlet. 下面对这两种方法做一简单的介绍, ...
- Android立刻终止一个线程
/** * Created by JuTao on 2017/2/4. * 如何中止一个线程 */ public class ThreadDone { public static void main( ...
- java中怎么终止一个线程的执行----个人学习心得
参考了一下两个网站的介绍: ①:http://blog.csdn.net/liuhanhan512/article/details/7077601 ②:http://www.blogjava.net/ ...
- Java线程(学习整理)--2---加入另一个线程join
1.join简介: 今天刚学的,这里我简单总结一下,join本身就是“加入”的意思,那么在线程中是什么意思呢?是在一个线程的run方法执行过程中,当特殊情况下需要执行一些其他的操作的时候,我们会用到j ...
- C# 启动和结束一个线程
在程序执行中会遇到启动本软件的exe问,或者启用其它的exe文件,已达到执行某些操作的作用.下面是两种最常见的启动exe文件. 1.调用系统dll使用其提供的方法. 引用的dll, [DllImpor ...
- 在Java中如何正确地终止一个线程
1.使用Thread.stop()? 极力不推荐此方式,此函数不安全且已废弃,具体可参考Java API文档 2.设置终止标识,例如: import static java.lang.System.o ...
- 安全终止MFC线程
终止线程 有两种情况可以使线程结束:控制函数结束或者根本就不允许线程完成,而提前终止它.我们可以想象在WORD中进行后台打印,如果打印结束了,那线程就可以结束了.如果用户中止了打印,那后台打印线程也要 ...
- Java基础学习总结(68)——有关Java线程方面的面试题
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java 语言一个重要的特点就是内置了对并发的支持,让 Java 大受企业和程序员的欢迎.大多数待遇丰厚的 Java 开发职位都要求开发者 ...
随机推荐
- 关于页面数据未保存改变路由(beforeunload,beforeRouteLeave)
一下内容为笔者个人理解,如有出入还请大佬指出不胜感激 页面有数据未保存,用户离开页面分为两种 1 . 直接关闭浏览器标签 或者点击浏览器后退按钮 离开当前页面 2. 在页面内改变路由,或则刷新页面(不 ...
- moment日期格式化插件
Moment.js是一个轻量级的JavaScript时间库,它方便了日常开发中对时间的操作,提高了开发效率.日常开发中,通常会对时间进行下面这几个操作:比如获取时间,设置时间,格式化时间,比较时间等等 ...
- eclipse export runnable jar(导出可执行jar包)
eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的 如果要导出可运行的JAR文件,需要选择Runnable Jar File. 1. 选择 ...
- jQuery EasyUI简介
jQuery EasyUI 是一个基于 jQuery 的框架,集成了各种用户界面插件. jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助we ...
- pycharm中代码窗口如何分成左右或者上下双栏
操作步骤如下: 其中window->edit_tabs->Split Vertically 是分成左右双栏:选择Split Horizontally 是分成上下双栏
- C# Winfrom UI 美化
Winfrom UI 美化 此处只做演示,未进行页面布局.... 1.CSkin:此处只显示一种样式供参考,可继承其他样式——略 2.MetroFramework.Design 3.Ribbon 4. ...
- 关于使用jquery评论插件...
.今天做项目,使用了一个评论插件 调用出来没事, 可是添加的时候报错 Uncaught TypeError: $(...).find(...).live is not a function 这个错误 ...
- 04_Redis_Hash命令
一:Redis 哈希(Hash) 1.1:Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象. 1.2:Redis 中每个 hash 可以存储 ...
- jemeter生成测试报告
Jmeter生成测试报告 相对于Loadrunner,Jmeter其实也是可以有测试报告产出的,虽然一般都不用(没有Loadrunner的报告那么强大是一方面),还是顺手写一下吧,其实方法在用命令 ...
- Python3+Appium学习笔记01-环境配置(上)
公司可能也有关于对app自动化的一些想法,让我去研究下.当然以移动互联网的热度.对于app自动化测试技术听闻已久.也一直想要去学习.正好.这次可以在工作时间中学习.emmm.希望自己能坚持把这个系列更 ...