zoukankan      html  css  js  c++  java
  • 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();
    }
  • 相关阅读:
    Android——如何申请发布版SHA1值
    一些镜像下载网站
    装了两个系统后,怎么删除不需要的那一个系统
    python基础入门之十八 —— 模块和包
    python基础入门之十七 —— 异常
    python基础入门之十六 —— 继承
    python基础入门之十五 —— 类与对象
    谷歌云免费服务器申请方法
    【ROM制作工具】小白如何进行ROM解包,精简,修改,授权,打包详细图文教程
    按键精灵脚本与Total Control手机群控系统的完美结合
  • 原文地址:https://www.cnblogs.com/ike_li/p/4709867.html
Copyright © 2011-2022 走看看