Qt下实现不同线程间的通信

文章目录

  • 前言
  • 一、代码实现
    • 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.我们是在连接好信号与槽之后,将当前任务加入不同线程。

下面是一个简单的Qt程序,实现了多线程UDP通信: ``` #include <QtCore/QCoreApplication> #include <QtCore/QThread> #include <QtNetwork/QUdpSocket> #include <QtNetwork/QHostAddress> class UdpThread : public QThread { Q_OBJECT public: UdpThread(QObject* parent = nullptr) : QThread(parent) {} signals: void messageReceived(const QByteArray& message); protected: void run() override { QUdpSocket socket; socket.bind(QHostAddress::LocalHost, 12345); while (!isInterruptionRequested()) { QByteArray buffer; buffer.resize(socket.pendingDatagramSize()); QHostAddress sender; quint16 senderPort; socket.readDatagram(buffer.data(), buffer.size(), &sender, &senderPort); emit messageReceived(buffer); } } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); UdpThread udpThread; QObject::connect(&udpThread, &UdpThread::messageReceived, [](const QByteArray& message){ qDebug() << "Received message:" << message; }); udpThread.start(); QUdpSocket socket; socket.writeDatagram("Hello world!", QHostAddress::LocalHost, 12345); return a.exec(); } #include "main.moc" ``` 该程序创建了一个`UdpThread`类来执行UDP通信的接收操作,`messageReceived`信号用于将接收到的消息传递给主线程处理。在主线程中,我们连接了`messageReceived`信号,打印接收到的消息,并向本地主机的12345端口发送了一条消息。 需要注意的是,如果要在Qt中使用多线程,需要在某些类中使用`Q_OBJECT`宏,并在`main.cpp`文件中添加`#include "main.moc"`语句以自动生成moc文件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值