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实现多线程的整个过程了,浏览过程中,如若发现错误,欢迎大家指正,有 问题的可以评论区留言或者私信。 最后,如果大家觉得有所帮助的话,可以点个赞,谢 谢大家!永远相信美好的事情即将发生! |