读书人

Qt学习之怎么启动和终止一个线程

发布时间: 2012-12-24 10:43:13 作者: rapoo

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_OBJECTpublic:    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

?

?

读书人网 >编程

热点推荐