一、继承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(); }