QThread
https://www.cnblogs.com/ike_li/p/4709867.html
Qt有两种多线程的方法,其中一种是继承QThread的run函数,另外一种是把一个继承于QObject的类转移到一个Thread里。
Qt4.8之前都是使用继承QThread的run这种方法,但是Qt4.8之后,Qt官方建议使用第二种方法。两种方法区别不大,用起来都比较方便,但继承QObject的方法更加灵活。这里要记录的是如何正确的创建一个线程,特别是如何正确的退出一个线程。
QThread只有run函数是在新线程里的 QThread只有run函数是在新线程里的 QThread只有run函数是在新线程里的
重要的事情说3遍!!!
,如果QThread是在ui所在的线程里生成,那么QThread的其他非run函数都是和ui线程一样的,所以,QThread的继承类的其他函数尽量别要有太耗时的操作,要确保所有耗时的操作都在run函数里。
在UI线程下调用QThread的非run函数(其实也不应该直接调用run函数,而应该使用start函数),和执行普通函数无区别,这时,如果这个函数要对QThread的某个变量进行变更,而这个变量在run函数里也会被用到,这时就需要注意加锁的问题,因为可能这个变量前几毫秒刚刚在run中调用,再调用时已经被另外的线程修改了。
#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); } }
#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
#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
#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;
}
#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
#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
#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 "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();
}
浙公网安备 33010602011771号