Qt学習のスレッドの開始と終了方法



 
今日はQtがどのようにスレッドを起動するかを見てみましょう.コードはQt 4のプログラミングに精通していることを例に挙げます.
まず、各ファイルの関連コードを指定してから分析します.
 
 
//*************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); // } } //***********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ファイルにコードを1行追加して実行します.
CONFIG+=thread