[qt] 多线程应用01

源码: 点击此处

一 多线程应用

  • 实现一个多线程的网络时间服务器,利用多线程功能的技术,为每个客户端返回当前的时间,并且在返回后自动退出。同时,服务器也会记录当前受到的请求次数。
  • 其实这相当于一个ntp时间服务器

二 服务器实现

2.1 创建服务器UI

  • 首先我们值得注意的是,这些new出来的对象都没有进行释放,是因为对于qt来说他的布局管理器会接管该布局上的控件或布局的所有权,并且我们在vLayout布局上设置了父类指针this,此时当这个类被释放时,vLayout和其上面的控件都会被释放。

#include <QDialog>class QLabel;
class QPushButton;
class MainWindow : public QDialog
{Q_OBJECTpublic:MainWindow(QDialog *parent = nullptr);~MainWindow();private:QLabel *m_label1;    // 显示监听端口QLabel *m_label2;    // 显示请求次数QPushButton *m_btn;  // 退出按钮
};MainWindow::MainWindow(QDialog *parent): QDialog(parent)
{setWindowTitle("多线程时间服务器");m_label1 = new QLabel(tr("服务器端口"));m_label2 = new QLabel;m_btn    =  new QPushButton(tr("退出"));QHBoxLayout *hLayout = new QHBoxLayout;hLayout->addStretch(1);hLayout->addWidget(m_btn);hLayout->addStretch(1);QVBoxLayout *vLayout = new QVBoxLayout(this);vLayout->addWidget(m_label1);vLayout->addWidget(m_label2);vLayout->addLayout(hLayout);connect(m_btn,&QPushButton::clicked,this,&MainWindow::close);m_count = 0;m_server = new CTcperver(this);if(!m_server->listen()){QMessageBox::critical(this,tr("多线程时间服务器"),tr("无法启动服务器: %1").arg(m_server->errorString()));close();return;}m_label1->setText(tr("服务器端口: %1").arg(m_server->serverPort()));
}

2.2 创建服务器处理socket

  • 首先我们继承QThread并重写run方法,但是要切记的是,这里的构造函数要传入socket描述符。
  • tcpSocket.setSocketDescriptor(m_sockerIntptr):用socket描述来构造出一个socket连接。
  • 这里使用数据流的方式写入数据,并且设置了数据流版本,这很重要,能够保证写入和读取的版本兼容性,因为当您设置数据流版本时,QDataStream会对数据进行特定版本的序列化处理。这意味着在序列化过程中,数据会被按照特定版本的要求进行格式化。
#include <QThread>
#include <QTcpSocket>class CTimeThread : public QThread
{Q_OBJECT
public:explicit CTimeThread(int socketDescriptor,QObject *parent = nullptr);
protected:void run() override;signals:void error(QTcpSocket::SocketError errStr);private:int m_sockerIntptr;
};
CTimeThread::CTimeThread(int socketDescriptor,QObject *parent):socketDescriptor(m_sockerIntptr),QObject{parent}
{}void CTimeThread::run()
{QTcpSocket tcpSocket;if(!tcpSocket.setSocketDescriptor(m_sockerIntptr)){emit error(tcpSocket.error());`return;}QByteArray block;QDataStream out(&block,QIODevice::WriteOnly);out.setVersion(QDataStream::Qt_5_12);uint time = QDateTime::currentDateTime().toSecsSinceEpoch();out<<time;tcpSocket.write(block);  // 将获取的当前时间传回客户端tcpSocket.disconnectFromHost(); // 断开连接tcpSocket.waitForDisconnected(); // 等待返回
}

2.3 服务器类

  1. 创建了一个继承自QTcpServer的类,
  2. 在成员函数中创建了一个之前创建的MainWindow也就是服务器的ui类
  3. 并且在构造函数中直接用传入的parent给他转换,这里首先要理解,对于C++继承来说,必须构造父类的构造函数才能构造成功,而QTcpServer就是构造父类,而(parent)的作用只是传递当前类的父对象,告诉qt的内存管理机制。本类的父对象是哪个。
  4. 然后在incoming里面进行的socket的处理,使用socket描述符创建对应的线程来处理。
  5. 在connect函数中处理了socket的线程的资源释放。
#include <QTcpServer>class MainWindow;
class CTcperver : public QTcpServer
{Q_OBJECT
public:explicit CTcperver(QObject *parent = nullptr);
protected:void incomingConnection(int sockerDescriptor);
private:MainWindow *dlg;
};CTcperver::CTcperver(QObject *parent): QTcpServer(parent)
{dlg = (MainWindow *)parent;
}void CTcperver::incomingConnection(int sockerDescriptor)
{CTimeThread *thread = new CTimeThread(sockerDescriptor,0);connect(thread,&CTimeThread::finished,dlg,&MainWindow::slotShow);connect(thread,&CTimeThread::finished,thread,&CTimeThread::deleteLater,Qt::DirectConnection);thread->start();
}

2.4 调用

    MainWindow w;w.show();

三 继承问题

  • 对于C++的子类继承父类必须要构造父类的构造函数
  • 在qt中使用构造函数比如上面的QTcpServer(parent),其实包含两个作用,第一完成基类的构造函数,而将传入的parent给当前类设置了父对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/396438.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

职场中,这些事情是禁忌

越级打报告 身处职场&#xff0c;一定要清晰地明确自己所处的位置。要了解部门的运营架构和人事结构&#xff0c;这是身为职场人对自己的最基本的要求。以此确保一旦工作中出现什么问题时&#xff0c;你能找到相应的负责人。但是这里一定要注意&#xff0c;千万不要故作聪明越…

【数据结构】顺序表实现

0. 前言 小伙伴们大家好&#xff0c;从今天开始&#xff0c;我们就开始学习《数据结构》这门课程~ 首先想给大家讲讲什么是数据结构&#xff1f; 0.1 数据结构是什么&#xff1f; 数据结构是由“数据”和“结构”两词组合⽽来。 什么是数据&#xff1f; 比如常⻅的数值1、…

【Material-UI】Button 中的点击事件处理(Handling clicks)详解

文章目录 一、点击事件处理基础1. 基本用法2. 事件处理器的传递 二、实际应用中的注意事项1. 事件处理逻辑的优化2. 避免过多的状态更新3. 使用合适的事件类型 三、关于文档中未提及的原生属性四、最佳实践1. 无障碍性2. 视觉反馈3. 防止重复点击 五、总结 在现代前端开发中&am…

【竞品分析】竞品分析的步骤

在产品经理的工作实际中,对产品的设计离不开竞品分析。 竞品分析可以辅助我们进行可行性评估、制定产品战略、优化产品迭代等。 可以说,竞品分析是贯穿产品生命周期的,是产品经理的必备专业技能。 个人认为&#xff0c;做自己家的产品是单一的视角&#xff0c;多做竞品分析会…

【微信小程序开发】——奶茶点餐小程序的制作(二)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

HTML 元素提供的附加信息--属性 ——WEB开发系列03

HTML 属性是指用于描述 HTML 元素的额外信息&#xff0c;它们提供了元素的特定配置或行为&#xff0c;属性通常包含在 HTML 元素的开始标签中。 元素也可以拥有属性&#xff0c;属性看起来像这样&#xff1a; 属性是元素的附加信息&#xff0c;它们不会显示在实际内容中。在前述…

Hack The Box-Resource

总体思路 phar反序列化->SSH CA私钥泄露->SSH CA私钥滥用->SSH脚本滥用 信息收集&端口利用 nmap -sSVC itrc.ssg.htb目标开放了两个ssh端口和一个80端口&#xff0c;先查看80端口 网站是一个SSG IT资源中心&#xff0c;主要用于解决网站问题、管理 SSH 访问、清…

【学习总结】MySQL篇

MySQL MySQL索引 B树 B树和作为索引&#xff0c;有两个明显特点 一是、他的层级非常低&#xff0c;我们都知道传统的平衡二叉树。它们的阶为2&#xff0c;如果数据量很大&#xff0c;AVL树&#xff08;传统的平衡二叉树&#xff09;的层级就非常深。但是B树&#xff0c;它是…

基于STM32F407+NBIOT+华为云IOT平台设计的环境检测系统

基于STM32F407NBIOT华为云IOT平台设计的环境检测系统实现的功能&#xff1a; 【1】能够采集本地环境的温度、湿度、烟雾浓度&#xff0c;火光信息&#xff0c;在OLED显示屏上显示。 如果检测到烟雾、温度、火光超过阀值会触发蜂鸣器报警。 【2】能够通过NBIOT将本地设备采集的信…

在 Django 表单中传递自定义表单值到视图

在Django中&#xff0c;我们可以通过表单的初始化参数initial来传递自定义的初始值给表单字段。如果我们想要在视图中设置表单的初始值&#xff0c;可以在视图中创建表单的实例时&#xff0c;传递一个字典给initial参数。 1、问题背景 我们遇到了这样一个问题&#xff1a;在使…

解决 MacOS 连接公司 VPN 成功但是不能网络的问题

目录 解决办法2024 Mac mini 爆料 解决办法 操作比较简单&#xff0c;修改配置文件即可&#xff08;如果没有则需要手动创建&#xff09;。 sudo vim /etc/ppp/options在此文件下&#xff0c;加入 plugin L2TP.ppp&#xff1a; plugin L2TP.ppp如果文件里有l2tpnoipsec&…

【SpringBoot系列】接口参数的默认值与必要性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

结构化输出及其使用方法

在 LLM 应用程序中构建稳健性和确定性 图片来自作者 欢迎来到雲闪世界。OpenAI最近宣布其最新的gpt-4o-2024–08–06模型支持结构化输出。与大型语言模型 (LLM) 相关的结构化输出并不是什么新鲜事——开发人员要么使用各种快速工程技术&#xff0c;要么使用第三方工具。 在本文…

[ACP云计算]组件介绍

一、IaaS、PaaS、SaaS 二、交换机 三、VPC 四、ECS 云服务器ECS&#xff08;Elastic Compute Service&#xff09;是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS&#xff08;Infrastructure as a Service&#xff09;级别云计算服务。云服务器ECS免去了您采购IT硬件的前期…

vue项目名修改、webstorm和idea创建的项目重命名、重构项目、修改项目名称

一、需求 就是创建了一个项目&#xff0c;后期需要重命名&#xff0c;怎么办&#xff1f;----> 直接修改&#xff1f;肯定不行&#xff0c;因为里面有些配置也需要修改&#xff0c;假如你只改文件夹名称的话&#xff0c;里面配置都没修改&#xff0c;后期可能会出问题。 二…

完美解决浏览器的输入框自动填入时,黄色背景问题,以及图标被遮住问题(最新)

用图说话↓↓↓ 首先用代码解决黄色背景问题&#xff0c;box-shadow颜色设置透明即可&#xff0c;延时渲染时间可修改为更久 :deep(input:-webkit-autofill) {box-shadow: 0 0 0 1000px transparent !important;/* 浏览器记住密码的底色的颜色 */-webkit-text-fill-color: #f…

C++:多态及虚函数

多态&#xff1a;面向对象的多态性可以分为4类:重载多态、强制多态、包含多态和参数多态。 多态从实现的角度来讲可以划分为两类:编泽时的多态和运行时的多态 运算符重载&#xff1a; foo(i)相当于i的一个别名 前置和后置重载&#xff08;后置参数必须加一个int&#xff09; …

Ubuntu 22.04 Docker安装笔记

1、准备一台虚机 可以根据《VMware Workstation安装Ubuntu 22.04笔记》来准备虚拟机。完成后&#xff0c;根据需求安装必要的软件&#xff0c;并设置root权限进行登录。 sudo apt update sudo apt install iputils-ping -y sudo apt install vim -y允许root ssh登录&#xff1…

邀请函 I 松下信息和望繁信科技邀您参加「数智时代下大数据应用的“道”与“术”」闭门会议

在数字化浪潮席卷全球的今天&#xff0c;大数据与智能化的结合成为企业成功的关键。为了深入探讨这一重要议题&#xff0c;松下信息系统&#xff08;上海&#xff09;有限公司&#xff08;简称“松下信息”&#xff09;与上海望繁信科技有限公司&#xff08;简称“望繁信科技”…

11.面试题——消息队列RabbitMQ

1.RabbitMQ是什么&#xff1f;特点是什么&#xff1f; RabbitMQ是一种开源的消息队列中间件&#xff0c;用于在应用程序之间进行可靠的消息传递。它实现了AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议&#xff0c;提供了强大的消息处理能力。RabbitMQ的…