第12章:Qthread
1,线程Qthread
2,源码:
#ifndef WORKTHREAD_H
#define WORKTHREAD_H
#include <QThread>
#include <QObject>
class WorkThread : public QThread
{
Q_OBJECT
public:
WorkThread(int num);
protected:
void run();
signals:
void sendText(QString str);
private:
int threadNum;
};
#endif // WORKTHREAD_H
#include "workthread.h"
WorkThread::WorkThread(int num)
{
threadNum= num;
}
void WorkThread::run()
{
QString str;
while(true)
{
str = "ThreadNum: ";
str += QString::number(threadNum);
emit sendText(str);
msleep(1000);
}
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QThread>
#include <QMutex>
#include "workthread.h"
namespace Ui {
class MainWindow;
}
#define MAXSIZE 5
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_startButton_clicked();
void on_stopButton_clicked();
void on_quitButton_clicked();
void ReceiveText(QString str);
private:
Ui::MainWindow *ui;
QMutex mutex;
WorkThread *workThread[MAXSIZE];
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->startButton->setEnabled(true);
ui->stopButton->setEnabled(false);
}
MainWindow::~MainWindow()
{
delete ui;
}
//开始
void MainWindow::on_startButton_clicked()
{
for (int i=0; i<MAXSIZE; i++)
{
workThread[i] = new WorkThread(i);
connect(workThread[i], SIGNAL(sendText(QString)), this, SLOT(ReceiveText(QString)));
}
for (int i=0; i<MAXSIZE; i++)
{
workThread[i]->start();
}
ui->startButton->setEnabled(false);
ui->stopButton->setEnabled(true);
}
//停止
void MainWindow::on_stopButton_clicked()
{
for (int i=0; i<MAXSIZE; i++)
{
workThread[i]->terminate(); //terminate()函数并不会立刻终止这个线程,该线程何时终止取决于操作系统调度策略
workThread[i]->wait();
}
ui->startButton->setEnabled(true);
ui->stopButton->setEnabled(false);
}
//退出
void MainWindow::on_quitButton_clicked()
{
ui->textEdit->clear();
}
void MainWindow::ReceiveText(QString str)
{
mutex.lock();
ui->textEdit->insertPlainText(str);
ui->textEdit->insertPlainText("\n");
ui->textEdit->moveCursor(QTextCursor::End);
mutex.unlock();
}
3,效果: