`
qimo601
  • 浏览: 3438521 次
  • 性别: 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

 

 

分享到:
评论

相关推荐

    12.1 Qt5多线程:多线程及简单实例

    QThread是Qt中的线程类,它提供了一个用户友好的接口,用于创建和管理线程。QThread拥有自己的事件循环,这意味着我们可以在子线程中使用Qt的事件驱动模型。通常,我们不会直接继承QThread,而是创建一个类并重写run...

    QT多线程实战源代码(QThread)

    QT是一个跨平台的C++库,广泛用于开发GUI应用程序,而QThread是QT提供的一种线程管理机制,使得开发者可以在QT环境中方便地处理并发和多任务执行。 在QT中,多线程的使用可以显著提高程序性能,特别是在执行耗时...

    Qt 串口,多线程(子线程处理串口信号)

    综上所述,这个项目展示了如何在Qt环境下使用串口通信和多线程技术实现一个高效、稳定的应用程序。通过合理的设计和编程,可以构建出能够实时接收和处理串口数据的子线程,同时保持主线程的轻量和响应性。

    QT开线程示例

    通常,我们可以在`run()`函数结束时或通过调用`quit()`和`wait()`来终止线程。 ```cpp myThread.quit(); // 请求线程退出 myThread.wait(); // 等待线程退出 ``` 5. **QObject与线程关联**: 如果需要在新...

    qt多线程实例-数据处理和UI界面显示

    例如,数据处理线程完成计算后,可以通过发射一个信号告知UI线程更新界面,而UI线程接收到信号后调用相应的槽函数进行界面更新。 3. **数据共享**:在多线程环境下,数据共享需要特别注意线程安全。可以使用`QMutex...

    QT.rar_QT 多线程_QT 多线程_QT线程_qt多线程_多线程qt

    2. **启动线程**:QThread对象的start()函数会启动一个新的线程,run()函数在此线程的上下文中执行。线程的优先级可以通过setPriority()函数设置。 3. **线程通信**:QT提供了一些信号和槽机制,使得不同线程间的...

    Qt多线程的一个简单例子

    总结来说,这个“Qt多线程的一个简单例子”展示了如何利用Qt的QThread类创建和管理线程,以及如何在主线程和工作线程之间进行通信。通过理解和实践这个例子,开发者能够更好地掌握Qt的多线程编程,提升应用程序的...

    QT多线程的实现方式:QThread run优雅的创建与退出QT多线程

    而terminate()方法则会立即终止线程,这种方式更直接但风险更大,因为它可能在不安全的状态下强制停止线程。 推荐使用quit()方法优雅地退出线程,确保线程在完成当前工作后自然结束: ```cpp thread-&gt;quit(); // ...

    Qt多线程经典例子

    Qt库,作为一个跨平台的应用程序开发框架,提供了强大的多线程支持。本篇我们将深入探讨“Qt多线程经典例子”,通过学习实例,理解如何在Qt环境中有效利用多线程。 1. **Qt中的线程** Qt为开发者提供了QThread类,...

    qt4 线程同步的小例子

    QT4线程同步的小例子是针对QT框架下多线程编程的一个示例,它为初学者提供了一个...这个实例将涵盖线程的创建、启动、终止,以及如何在多线程间进行有效的数据通信和同步,对于提升对QT4多线程编程的理解非常有帮助。

    Qt多线程实现 时间刷新

    在本例中,我们将在一个次线程中创建一个定时器,该定时器周期性地获取系统时间并将其传递到主线程。以下是实现步骤: 1. **创建新线程**:首先,我们需要继承QThread类并重写`run()`方法。在这个方法中,我们将...

    线程的挂起、唤醒和终止

    当耗时任务完成后,我们可以发送一个信号(如设置共享变量或调用`notify()`)来唤醒进度条线程,让它知道任务已完成,进而更新进度条至100%并终止。 总结来说,理解并掌握线程的挂起、唤醒和终止是多线程编程中的...

    Qt 多线程简单实例

    `QThread`为用户提供了一个在新线程中执行对象的方法,避免了长时间运行的任务阻塞主线程,导致UI无响应。在描述中提到的实例中,可能创建了一个`QThread`子类,用于执行循环打印数字0到9的任务。 **线程的创建与...

    Qt多线程实例

    Qt是一个跨平台的C++图形用户界面库,它提供了丰富的功能来支持多线程编程。本文将深入探讨在Qt中实现多线程的实例,并解释相关知识点。 首先,我们要理解Qt中的线程模型。Qt提供两种主要的线程类:QThread和Qt ...

    qt线程传递参数.7z

    记得在不使用线程时调用`QThread::quit()`和`QThread::wait()`来优雅地终止线程。 总之,Qt的线程和参数传递机制非常强大且灵活,能够满足各种复杂的并发需求。通过深入理解这些概念,你可以构建出高效、稳定且线程...

    qt线程实例

    QT线程实例是关于Qt框架中线程应用的一个实践示例。Qt是一个强大的跨平台应用程序开发框架,由C++编写,广泛应用于桌面、移动和嵌入式设备的GUI设计。在多核处理器和高并发需求的现代软件开发中,线程技术显得尤为...

    QT_MulThread多线程

    Qt是一个跨平台的C++图形用户界面应用程序框架,它提供了丰富的功能和API,包括对多线程的支持。在Qt中,我们可以通过`QThread`类来创建和管理线程,以实现并发执行任务。`QThread`不仅提供了线程的基础功能,还引入...

    Qt 多线程实现动态波形图表

    标题中的"Qt 多线程实现动态波形图表",意味着我们将创建一个Qt应用,其中有一个线程专门用于处理波形数据的生成和计算,而另一个线程则负责更新UI上的QChart组件。QChart是Qt的图表库,可以用来绘制各种类型的统计...

    基于QT的多线程下载实例

    此外,为了防止内存泄漏,确保在下载完成后正确地关闭`QNetworkReply`和终止线程。 在文件下载完成后,所有线程的数据应当合并成一个完整的文件。这可以通过在主线程中维护一个缓冲区,每当一个线程完成下载一部分...

Global site tag (gtag.js) - Google Analytics