QT中实现多线程有两种方式:
一:继承QThread,重载run()函数,启动事件循环exec()。缺点:只有run()函数中的代码运行在次线程中。
二:继承QObject,利用moveToThread(QThread * targetThread)函数将对象移动到次线程,则对象运行在次线程中。
推荐第二种方法。代码例程如下:
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QThread>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
signals:
void SigToThread(); //该信号用于触发次线程接收数据
private slots:
void on_pushButton_clicked();
void doShow();
private:
Ui::Widget *ui;
QThread mythread;
};
#endif // WIDGET_H
workerthread.h:
#ifndef WORKERTHREAD_H
#define WORKERTHREAD_H
#include <QObject>
#include <QThread>
#include <QDebug>
class WorkerThread : public QObject
{
Q_OBJECT
public:
explicit WorkerThread(QObject *parent = 0);
signals:
void SigToShow();
public slots:
void doProcessData();
private:
QThread mythread;
};
#endif // WORKERTHREAD_H
widget.c
#include "widget.h"
#include "ui_widget.h"
#include "workerthread.h"
#include <QByteArray>
QByteArray array;
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
WorkerThread* workerObj = new WorkerThread;
workerObj->moveToThread(&mythread);
connect(&mythread,SIGNAL(finished()),workerObj,SLOT(deleteLater()));
connect(this,SIGNAL(SigToThread()),workerObj,SLOT(doProcessData()));
connect(workerObj,SIGNAL(SigToShow()),this,SLOT(doShow()));
mythread.start();
qDebug() << "Now in Mainthread id:" << QThread::currentThreadId(); //打印当前线程号
}
Widget::~Widget()
{
mythread.quit();
mythread.wait();
delete ui;
}
void Widget::on_pushButton_clicked()
{
array = QByteArray("hello");
qDebug() << "array : " << array.data();
qDebug() << "wWiling to emit SigToThread";
emit SigToThread();
}
void Widget::doShow(){
qDebug() << "array : " << array.data();
}
workerthread.c:
#include "workerthread.h"
extern QByteArray array;
WorkerThread::WorkerThread(QObject *parent) : QObject(parent)
{
}
void WorkerThread::doProcessData(){
qDebug() << "Now in WorkerThread id:" << QThread::currentThreadId();
// array.clear();
array = QByteArray("jiangyu88");
qDebug() << "WorkerThread: array : " << array.data();
emit SigToShow();
qDebug() << "emit SigToShow()";
}
main.c:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
运行效果:
点击“发送”按钮
可见array操作代码成功运行在了次线程,完成。