`
qimo601
  • 浏览: 3416709 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Qt学习之如何启动和终止一个线程

    博客分类:
  • Qt
阅读更多

 

 

今天来看看Qt如何启动一个线程吧,代码就以精通Qt4编程的为例

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

 

 

//*************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 多线程简单实例

    Qt多线程循环打印数字0~9,知道按下“停止按钮”终止所有线程。

    Qt5开发及实例-CH1201.rar,Qt5将启动数个工作线程的代码

    Qt5开发及实例,实例CH1201,如图12.1所示,单击“开始”按钮将启动数个工作线程(工作线程数目由MAXSIZE宏决定),各个线程循环打印数字0~9,直到单击“停止”按钮终止所有线程为止。 实现步骤如下。 (1)在头文件...

    PyQt5多线程的执行和停止

    实现三个线程同时执行,且可以单独关闭和运行,通过进度条实现可视化演示。

    主线程等待子线程结束

    对于多线程而言,一个主要的难题就是如何线程是否都已经执行结束。 也就是说,需要在主线程开启子多线程后,直到子线程全部执行结束为止,回到主线程。

    快速解决pyqt5窗体关闭后子线程不同时退出的问题

    用pyqt5设计了一个主窗体,在窗体运行时需要把一个无限循环放在一个线程去工作。运行后,发现通过鼠标按主窗体的关闭按键关闭主创体后,线程不会自动终止,依然在运行。尽管对我的使用场景来说,这不是问题,因为...

    进度条窗体

    进度条 backgrandworker 线程

    Multithreaded-FTP-Client-and-Server:客户端和服务器都是多线程的

    此外,它们还将支持另一个名为“terminate”的命令,该命令用于终止来自同一客户端的长时间运行的命令(例如,get 和 put on 大文件)。 终止命令的语法如下: 终止 - 终止由 标识的命令(有关命令 ID 的说明,请...

    mytimer.zip

    1、创建继承QWidget的qt界面类,...3、主界面设计:对开始和停止按钮创建槽函数,对线程启动(start)和终止(terminate)写入槽函数中;创建线程发射信号连接connect,对连接槽函数实现lcd_number进行display显示。

    pyqt5 的多线程(QThread)遇到的坑(二)

    被实例化的类是做数据处理的,传入和导出的的数据比较大,最少都是几万行的excel表格数据(pandas.DataFrame),而且传入的数据最少两个pandas.DataFrame表,多的时候会传入7个,而且有一些数据是公共数据,每次处理...

    Linux高性能服务器编程

    3.5.1 访问不存在的端口 3.5.2 异常终止连接 3.5.3 处理半打开连接 3.6 TCP交互数据流 3.7 TCP成块数据流 3.8 带外数据 3.9 TCP超时重传 3.10 拥塞控制 3.10.1 拥塞控制概述 3.10.2 慢启动和拥塞避免 ...

Global site tag (gtag.js) - Google Analytics