目的:在主窗口创建多个线程,每个线程处理同一个类的不同对象。
前言
工具类.h文件:
#ifndef FUNCTION_H
#define FUNCTION_H
#include <QObject>
#include <QThread>
#include <QDebug>
class Function : public QObject
{
Q_OBJECT
public:
explicit Function(QObject *parent = nullptr);
public slots:
void working();
signals:
};
#endif // FUNCTION_H
窗口.h文件:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QThread>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
signals:
void sigInit();
};
#endif // WIDGET_H
错误例子:
#include "widget.h"
#include "ui_widget.h"
#include "function.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
qDebug() << "主线程地址:" << QThread::currentThread();
//创建3个子线程,同时创建3个工具对象
for(int i=0;i<3;i++){
QThread *t = new QThread;
Function *f = new Function;
qDebug() << "f的地址:" << f;
//将工具对象交给对应子线程管理
f->moveToThread(t);
//启动子线程,先空转
t->start();
//调用f的成员函数,working中将会打印子线程地址
f->working();
}
}
Widget::~Widget()
{
delete ui;
}
错误例子结果如下:
可以看出创建的3个子线程地址与主线程一样;
原因是如果工具对象直接调用成员函数,则还是会在主线程执行;
解决办法是将working()作为槽函数。
正确例子:
#include "widget.h"
#include "ui_widget.h"
#include "function.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
qDebug() << "主线程地址:" << QThread::currentThread();
for(int i=0;i<3;i++){
QThread *t = new QThread;
Function *f = new Function;
connect(this, &Widget::sigInit, f, &Function::working);
qDebug() << "f的地址:" << f;
f->moveToThread(t);
t->start();
}
emit sigInit();
}
Widget::~Widget()
{
delete ui;
}
正确例子结果如下:
通过 connect(this, &Widget::sigInit, f, &Function::working);和 emit sigInit();触发对象的working()函数后,成功开启了3个子线程。