当前位置: 首页 > news >正文

Qt实现多线程

Qt服务器多线程

  • 1、新建线程类
  • 2、修改线程头文件
  • 3、包含头文件,启动线程
  • 4、重写run()函数
    • 4.1把socket传过去
    • 4.2重写run()函数
  • 5、创建处理接收到来自客户端数据的槽函数
  • 6、自定义一个信号用来把数据发送出去
  • 7、Widget接收信号
  • 8、创建处理sendToServer信号的槽函数
  • 9、.h文件和.cpp文件
    • 9.1 mythread.h
    • 9.2 mythread.cpp
    • 9.3 Widget.h
    • 9.4Widget.cpp
  • 10、总结

1、新建线程类

在这里插入图片描述
在这里插入图片描述

2、修改线程头文件

#include <QObject>
#include <QThread>
#include <QTcpSocket>

// 定义 myThread 类,继承自 QThread 类,用于创建处理客户端连接的独立线程
class myThread : public QThread

3、包含头文件,启动线程

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <mythread.h>
//启动线程
myThread *t = new myThread(socket);     //创建线程对象
t->start();                     //开始线程

4、重写run()函数

4.1把socket传过去

myThread *t = new myThread(socket);     //创建线程对象
private:
    QTcpSocket *socket;      //创建网络通信对象,用来接受参数传递
public:
    // 显式构造函数,接受一个 QTcpSocket 指针参数 s,用于初始化 socket 成员变量
    explicit myThread(QTcpSocket *s);   
myThread::myThread(QTcpSocket *s)
{
    socket = s;
}

4.2重写run()函数

public:
    // 显式构造函数,接受一个 QTcpSocket 指针参数 s,用于初始化 socket 成员变量
    explicit myThread(QTcpSocket *s);   

    void run() override;        //线程处理函数
void myThread::run()
{
    //当有数据可读时,readyRead 信号被触发
    connect(socket, &QTcpSocket::readyRead, this, &myThread::clientHandle);
}

5、创建处理接收到来自客户端数据的槽函数

private slots:
    void clientHandle();     //处理来自客户端信息
//处理来自客户端的信息
void myThread::clientHandle()
{
   
    QByteArray data = socket->readAll();     // 使用 socket 成员变量读取所有可用的数据
    emit sendToServer(data);      // 发射 sendToServer 信号,并传递从 socket 读取到的数据
}

6、自定义一个信号用来把数据发送出去

signals:
    // 自定义信号 sendToServer,向服务器发送QByteArray 类型的数据
    void sendToServer(QByteArray data);
//处理来自客户端的信息
void myThread::clientHandle()
{
    QByteArray data = socket->readAll();     // 使用 socket 成员变量读取所有可用的数据
    emit sendToServer(data);      // 发射 sendToServer 信号,并传递从 socket 读取到的数据给服务器
}

7、Widget接收信号

//处理sendToServer信号
connect(t,&myThread::sendToServer, this, &Widget::threadHandle);

8、创建处理sendToServer信号的槽函数

void threadHandle(QByteArray data);     //处理sendToWidget信号的槽函数
//处理sendToServer信号
void Widget::threadHandle(QByteArray data)
{
    ui->serverRevtextEdit->setText(QString(data));     //显示接收到的数据
}

9、.h文件和.cpp文件

9.1 mythread.h

mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include <QThread>
#include <QTcpSocket>

// 定义 myThread 类,继承自 QThread 类,用于创建处理客户端连接的独立线程
class myThread : public QThread
{
    Q_OBJECT
public:
    // 显式构造函数,接受一个 QTcpSocket 指针参数 s,用于初始化 socket 成员变量
    explicit myThread(QTcpSocket *s);

    void run() override;        //线程处理函数

signals:
    // 自定义信号 sendToServer,向服务器发送QByteArray 类型的数据
    void sendToServer(QByteArray data);

private slots:
    void clientHandle();     //处理来自客户端信息

private:
    QTcpSocket *socket;      //创建网络通信对象,用来接受参数传递


};

#endif // MYTHREAD_H

9.2 mythread.cpp

mythread.cpp

#include "mythread.h"

myThread::myThread(QTcpSocket *s)
{
    socket = s;
}

void myThread::run()
{
    //当有数据可读时,readyRead 信号被触发
    connect(socket, &QTcpSocket::readyRead, this, &myThread::clientHandle);
}

//处理来自客户端的信息
void myThread::clientHandle()
{
    QByteArray data = socket->readAll();     // 使用 socket 成员变量读取所有可用的数据
    emit sendToServer(data);      // 发射 sendToServer 信号,并传递从 socket 读取到的数据给服务器
}

9.3 Widget.h

Widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <mythread.h>

#define PORT 8000

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void newClientHandler();        //服务器处理

    //void serverRevMessage();        //服务器读取

    void threadHandle(QByteArray data);     //处理sendToWidget信号的槽函数

private:
    Ui::Widget *ui;

    QTcpServer *server;         //定义服务器对象
};
#endif // WIDGET_H

9.4Widget.cpp

Widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    server = new QTcpServer(this);

    server->listen(QHostAddress::AnyIPv4,PORT);

    //有新的客户端连接,会发出信号
    connect(server,&QTcpServer::newConnection,this, &Widget::newClientHandler);

}

Widget::~Widget()
{
    delete ui;
}

void Widget::newClientHandler()
{
    QTcpSocket *socket = server->nextPendingConnection();

    socket->peerAddress();
    socket->peerPort();

    ui->serveripLineEdit->setText((socket->peerAddress()).toString());
    ui->serverportLineEdit->setText(QString::number(socket->peerPort()));

    //服务器收到客户端发送的信息,sockket发出readyread信号
//    connect(socket,&QTcpSocket::readyRead, this, &Widget::serverRevMessage);

    //启动线程
    myThread *t = new myThread(socket);     //创建线程对象
    t->start();                     //开始线程

    //处理sendToServer信号
    connect(t,&myThread::sendToServer, this, &Widget::threadHandle);

}

//处理sendToServer信号
void Widget::threadHandle(QByteArray data)
{
    ui->serverRevtextEdit->setText(QString(data));     //显示接收到的数据
}

//服务器读取
/*
void Widget::serverRevMessage()
{
    QTcpSocket *clientsocket = (QTcpSocket *)sender();
    ui->serverRevtextEdit->setText(clientsocket->readAll());
}
*/

10、总结

以上就是Qt实现多线程的整个过程了,浏览过程中,如若发现错误,欢迎大家指正,有

问题的可以评论区留言或者私信。 最后,如果大家觉得有所帮助的话,可以点个赞,谢

谢大家!永远相信美好的事情即将发生!
Qt实现多线程完成!

相关文章:

  • Qt鼠标事件
  • kubernetes对于一个nginx服务的增删改查
  • Linux内核网络驱动中的队列选择机制深度解析
  • log4j2漏洞
  • 案例驱动的 IT 团队管理:创新与突破之路:第一章 重构 IT 团队管理:从传统到创新-1.1.1技术迭代加速与人才断层
  • 量子计算 × 虚拟现实:未来科技的双剑合璧
  • 电子电气架构 --- 汽车面对软件怎么“破局“?
  • Linux驱动开发进阶 - 文件系统
  • TS常见内置映射类型的实现及应用场景
  • Emacs 折腾日记(十七)——文本属性
  • Spark Sql 简单校验的实现
  • 大模型-提示词调优
  • 使用VSCode开发STM32补充(Debug调试)
  • Django连接MySQL
  • 徒手打造个人AI Agent:基于DeepSeek-R1+websearch从零构建类Manus深度探索智能体AI-Research
  • python爬虫Scrapy(5)之增量式
  • 使用Java调用Windows通知并显示自定义图标
  • 使用memmove优化插入排序
  • 【专项测试】限流测试
  • maven的安装配置
  • 网站制作的网站开发/网络营销类型
  • 网站内的搜索怎么做的/成都网站seo性价比高
  • java做3d游戏下载网站/浏览器谷歌手机版下载
  • 引导企业做网站/新品上市怎么做宣传推广
  • 顺德网站制作公司/软文拟发布的平台与板块
  • 海口做网站公司/百度客户端