文章目录
- 前言
- 一、代码实现
- 1.头文件
- 2.将任务移入线程中
- 总结
前言
Qt中可以实现对象与对象之间的通信,通过信号与槽来实现,我们今天来实现不同线程之间的通信:1.定义一个继承于Q0bject的Task类,在Task类中定义一个槽slot函数slotTaskA()和slotTaskB(),函数中定义线程需要做的工作。
2、在要使用线程的mainWindow类中,新建一个Task类对象,使用moveToThread(方法将Task对象的事件循环全部交由QThread对象处理。
3.建立相关的信号函数和槽函数进行连接,然后发出信号触发QThread的槽函数,使其执行工作。
一、代码实现
1.头文件
mainwindow.h
在要使用线程的mainWindow类中,新建一个Task类对象,使用moveToThread(方法将Task对象的事件循环全部交由QThread对象处理。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "MyThread.h"
#include "Task.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
signals:
void signalA();
void signalB();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
private:
Ui::MainWindow *ui;
MyThread *myThread;
Task *task;
};
#endif // MAINWINDOW_H
task.h
1.定义一个继承于Q0bject的Task类,在Task类中定义一个槽slot函数slotTaskA()和slotTaskB(),函数中定义线程需要做的工作。
#ifndef TASK_H
#define TASK_H
#include <QObject>
class Task : public QObject
{
Q_OBJECT
public:
explicit Task(QObject *parent = nullptr);
signals:
public slots:
void slotTaskA();
void slotTaskB();
};
#endif // TASK_H
Task::Task(QObject *parent) : QObject(parent) { } void Task::slotTaskA() { for (int i = 0; i < 5; ++i) { QThread::sleep(1); qDebug() << "任务A正在执行"; } } void Task::slotTaskB() { for (int i = 0; i < 5; ++i) { QThread::sleep(1); qDebug() << "任务B正在执行"; } }
2.将任务移入线程中
3.建立相关的信号函数和槽函数进行连接,然后发出信号触发QThread的槽函数,使其执行工作。
该处使用的url网络请求的数据。
connect(this, &MainWindow::signalA, task, &Task::slotTaskA);
connect(this, &MainWindow::signalB, task, &Task::slotTaskB);
QThread *thr = new QThread(this);
thr->start(); // 开启线程
task->moveToThread(thr); //移动任务到线程里,通过信号触发槽函数,槽函数在另一个线程执行
总结
这就是不同线程对象之间的通信,有几点需要注意:
1.在初始化Task对象时,不要将其加入内存管理。
2.我们是在连接好信号与槽之后,将当前任务加入不同线程。