一、继承QThread实现多线程
#ifndef WORKER_H
#define WORKER_H
#include <QThread>
#include <QDebug>
class Worker : public QThread
{
Q_OBJECT
public :
Worker ( ) ;
signals:
void Finished ( int value) ;
private :
void run ( ) override;
} ;
#endif
#include "worker.h"
Worker:: Worker ( )
{
qDebug ( ) << "Worker::Worker() Thread ID = " << QThread:: currentThreadId ( ) ;
}
void Worker:: run ( ) {
qDebug ( ) << "Worker::run() Thread ID = " << QThread:: currentThreadId ( ) ;
for ( int a = 1000 ; a > 0 ; a -- ) {
for ( int b = 1000 ; b > 0 ; b -- ) {
}
}
emit Finished ( 3 ) ;
}
#ifndef CONTROLLER_H
#define CONTROLLER_H
#include <QObject>
#include <QDebug>
#include "worker.h"
class Controller : public QObject
{
Q_OBJECT
public :
Controller ( ) ;
~ Controller ( ) ;
void StartProcess ( ) ;
private slots:
void Result ( int value) ;
private :
Worker * worker_p;
} ;
#endif
#include "controller.h"
Controller:: Controller ( )
{
worker_p = new Worker ( ) ;
connect ( worker_p, & Worker:: Finished, this , & Controller:: Result) ;
}
Controller:: ~ Controller ( ) {
delete worker_p;
}
void Controller:: StartProcess ( ) {
qDebug ( ) << "Controller::StartProcess() thread ID = " << QThread:: currentThreadId ( ) ;
worker_p- > start ( ) ;
}
void Controller:: Result ( int value) {
qDebug ( ) << "Controller::Result = " << value << " thread Id = " << QThread:: currentThreadId ( ) ;
}
#include <QCoreApplication>
#include <QDebug>
#include "controller.h"
int main ( int argc, char * argv[ ] )
{
qDebug ( ) << "Main Thread ID = " << QThread:: currentThreadId ( ) ;
QCoreApplication a ( argc, argv) ;
Controller c;
c. StartProcess ( ) ;
return a. exec ( ) ;
}
二、QObject::moveToThread()实现多线程
#ifndef WORKER_H
#define WORKER_H
#include <QObject>
#include <QDebug>
#include <QThread>
class Worker : public QObject
{
Q_OBJECT
public :
Worker ( ) ;
signals:
void Finished ( int value) ;
public :
void DoWork ( ) ;
} ;
#endif
#include "worker.h"
Worker:: Worker ( )
{
qDebug ( ) << "Worker::Worker() Thread ID = " << QThread:: currentThreadId ( ) ;
}
void Worker:: DoWork ( ) {
qDebug ( ) << "Worker::DoWork Thread ID = " << QThread:: currentThreadId ( ) ;
for ( int a = 1000 ; a > 0 ; a -- ) {
for ( int b = 1000 ; b > 0 ; b -- ) {
}
}
emit Finished ( 3 ) ;
}
#ifndef CONTROLLER_H
#define CONTROLLER_H
#include <QObject>
#include <QThread>
#include <QDebug>
#include "worker.h"
class Controller : public QObject
{
Q_OBJECT
public :
Controller ( ) ;
~ Controller ( ) ;
void StartProcess ( ) ;
private slots:
void Result ( int value) ;
private :
QThread * thread_p;
} ;
#endif
#include "controller.h"
Controller:: Controller ( )
{
thread_p = new QThread ( ) ;
Worker * worker = new Worker ( ) ;
worker- > moveToThread ( thread_p) ;
connect ( worker, & Worker:: Finished, this , & Controller:: Result) ;
connect ( thread_p, & QThread:: started, worker, & Worker:: DoWork) ;
connect ( thread_p, & QThread:: finished, worker, & QObject:: deleteLater) ;
}
Controller:: ~ Controller ( )
{
thread_p- > quit ( ) ;
thread_p- > wait ( ) ;
delete thread_p;
}
void Controller:: StartProcess ( ) {
qDebug ( ) << "Controller::StartProcess() thread ID = " << QThread:: currentThreadId ( ) ;
thread_p- > start ( ) ;
}
void Controller:: Result ( int value) {
qDebug ( ) << "Controller::Result = " << value << " thread Id = " << QThread:: currentThreadId ( ) ;
}
#include <QCoreApplication>
#include <QDebug>
#include "controller.h"
int main ( int argc, char * argv[ ] )
{
qDebug ( ) << "Main Thread ID = " << QThread:: currentThreadId ( ) ;
QCoreApplication a ( argc, argv) ;
Controller c;
c. StartProcess ( ) ;
return a. exec ( ) ;
}