第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,效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ksmtnsv37297/article/details/86674384
今日推荐