Qt QThread 多线程使用

一、继承QThread 使用方法

1.创建个继承QThread的类。

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include<QThread>
#include<QtCore>
class MyThread : public QThread
{
    Q_OBJECT
public:
   explicit MyThread(QObject *parent = 0);
    ~MyThread();

public:
    void run();
    bool stop=false;
signals:
    void NumberChanged(int number);

};

#endif // MYTHREAD_H
#include "mythread.h"

MyThread::MyThread(QObject *parent)
{

}

MyThread::~MyThread()
{

}

void MyThread::run()
{
    for(int i=0;i<1000;i++)
    {
        QMutex mutex;
        mutex.lock();
        if(this->stop)
        {
            break;
        }
        else
        {
           mutex.unlock();
        }

       emit NumberChanged(i);
       this->msleep(100);

    }

}

2.调用代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<mythread.h>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 public:
    MyThread *mThread;

private:
    Ui::MainWindow *ui;

private slots:
    void onNumberChanged(int number);
    void on_btnStart_clicked();
    void on_btnStop_clicked();
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    mThread=new MyThread(this);
    QObject::connect(mThread,SIGNAL(NumberChanged(int)),this,SLOT(onNumberChanged(int)));

}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::onNumberChanged(int number)
{

    ui->lblNumber->setText(QString::number(number));
}

void MainWindow::on_btnStart_clicked()
{
    mThread->start();
      mThread->stop=false;

}

void MainWindow::on_btnStop_clicked()
{
    //mThread->stop=true;

    mThread->stop=true;

}

 二、 moveToThread 使用方法

 

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QObject>
#include<QDebug>
#include<QThread>
#include<QLabel>

class MyObject : public QObject
{
    Q_OBJECT
public:
    explicit MyObject(QObject *parent = 0);
    ~MyObject();

signals:

public slots:
    void Thread1();
    void Thread2(QLabel *lbl);
    void Thread3();

};

#endif // MYOBJECT_H
#include "myobject.h"

MyObject::MyObject(QObject *parent) : QObject(parent)
{

}

MyObject::~MyObject()
{

}

void MyObject::Thread1()
{

    qDebug()<<QThread::currentThreadId();
}
void MyObject::Thread2(QLabel *lbl)
{

     for(int i=0;i<1000000000;i++)
     {}
     lbl->setText("aaaaa");
    qDebug()<<QThread::currentThreadId();
}
void MyObject::Thread3()
{
    qDebug()<<QThread::currentThreadId();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<myobject.h>


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

private:
    Ui::MainWindow *ui;

public:
    MyObject *myobj;



};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    myobj=new MyObject;
    QThread *mythread=new QThread;
    myobj->moveToThread(mythread);
    mythread->start();

    connect(mythread,SIGNAL(started()),myobj,SLOT(Thread1()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    myobj->Thread1();


}

void MainWindow::on_pushButton_2_clicked()
{

     myobj->Thread2(ui->label);
}

void MainWindow::on_pushButton_3_clicked()
{
     myobj->Thread3();

}

void MainWindow::on_pushButton_4_clicked()
{
    qDebug()<<QThread::currentThreadId();
}
原文地址:https://www.cnblogs.com/ike_li/p/4709867.html