Qt-系统相关(2)多线程网络
Qt多线程
QThread 常⽤ API:
使用线程
关于创建线程的步骤:
用多线程实现定时器功能
创建一个新的类:
记得勾选下面的 add Q_OBJECT
然后重写这个类的run函数
也定义了一个信号
然后在Widget构造函数中初始化,还有定义槽函数
执行结果:
关于这个start函数,这个才是真正调用系统API创建线程,新的线程创建出来后,会自动的执行run函数。
可以使用一个wait,让一个线程等待另一个线程的结束。
另外之前也说过,只有主线程才能针对界面的控件进行状态的修改。
理解Qt的多线程
我们之前学过的多线程,是站在服务器的角度上来看待的,对于服务器来说:多线程最主要的目的就是要充分利用多核CPU的计算资源。
而对于客户端来说,多线程仍然非常有意义,但是与服务器的侧重点不同。
对于普通用户来说,“使用体验”是非常重要的话题。
客户端上的程序很少会使用多线程把计算资源吃完。
相比之下,客户端的多线程主要是通过多线程的方式来执行一些耗时的IO操作,这样可以避免主线程被卡死,造成不好的用户体验。比如我们用迅雷下载文件,当文件很大,要20分钟才能下载完,那么在下载的过程中,用户的界面不可能得一直阻塞住吧?
因此,我们可以使用一个单独的新线程来处理这种IO密集的操作。
线程安全问题
谈到线程,始终绕不开的就是线程安全问题。
在Qt中实现线程互斥和同步常⽤的类有:
简单使用互斥锁
场景:两个线程对一个变量进行++,每个线程执行5000次。
重写run函数
初始化操作
结果:
对于Qt的互斥锁
条件变量
使用示例:
QMutex mutex;
QWaitCondition condition;
//在等待线程中
mutex.lock();
//检查条件是否满⾜,若不满⾜则等待
while (!conditionFullfilled())
{condition.wait(&mutex); //等待条件满⾜并释放锁
}
//条件满⾜后继续执⾏
//...
mutex.unlock();
//在改变条件的线程中
mutex.lock();
//改变条件
changeCondition();
condition.wakeAll(); //唤醒等待的线程
mutex.unlock();
信号量
示例:
QSemaphore semaphore(2); //同时允许两个线程访问共享资源
//在需要访问共享资源的线程中
semaphore.acquire(); //尝试获取信号量,若已满则阻塞
//访问共享资源
//...
semaphore.release(); //释放信号量
//在另⼀个线程中进⾏类似操作
Qt网络
和多线程类似, Qt 为了⽀持跨平台, 对⽹络编程的 API 也进⾏了重新封装
UDP Socket
主要的类有两个. QUdpSocket 和 QNetworkDatagram
QUdpSocket 表⽰⼀个 UDP 的 socket ⽂件。
QNetworkDatagram 表⽰⼀个 UDP 数据报
UDP回显服务器
一般一个正经的服务器是很少会带有图形化界面的,一般都是命令行。
服务器部分
用一个listWidget来显示信息
初始化部分:
主要执行逻辑:
客户端部分
界面部分
初始化代码:
按钮对应的槽函数实现:
再次修改Widget构造函数,通过信号槽来处理服务器的响应
用lambda表达式的方式
客户端演示:
服务器演示:
我们也可以启动多个客户端向服务器发起请求。
关于这里面的一些细节
在传参的时候关于什么时候用 引用类型,什么时候用值类型:
大的原则上是尽量使用引用类型。
但是有些时候,比如不同类型相互转换的时候,大概率使用值类型
两个问题:
这个Udp服务器是否能放到Linux云服务上呢?
大概率不行。这取决于这个云服务器是否安装了图形化界面,Qt程序需要依赖图形化界面来运行。
能否用现在的Udp客户端连接云服务器上linux的Udp服务器?
是可以的。
一般的商业公司都不会用Qt编写服务器,但是会用Qt编写客户端。
TCPSocket
核⼼类是两个: QTcpServer 和 QTcpSocket
QTcpServer ⽤于监听端⼝, 和获取客⼾端连接.
关于QTcpServer:
QTcpSocket ⽤⼾客⼾端和服务器之间的数据交互
关于QTcpSocket:
TCP回显服务器
服务器部分
初始化:
处理新连接的槽函数:
这里跟UDP就有明显不同了,主要是对连接的处理
void Widget::processConnection()
{// 注意和UDP的区别// 1.先获取新连接对应的socketQTcpSocket* clientSocket = server->nextPendingConnection();// 构建日志QString log = "客户端:" + clientSocket->peerAddress().toString() + ":" + QString::number(clientSocket->peerPort()) + "上线了";ui->listWidget->addItem(log);// 2.设置连接可读就绪的槽函数connect(clientSocket,&QTcpSocket::readyRead,clientSocket,[=](){// 读取请求QString request = clientSocket->readAll();// 构建响应QString response = prase(request);// 返回响应clientSocket->write(response.toUtf8());// 打印日志QString log = "客户端:" + clientSocket->peerAddress().toString() + ":" + QString::number(clientSocket->peerPort()) + " 说: " + response;ui->listWidget->addItem(log);});// 3.设置连接断开时的槽函数connect(clientSocket,&QTcpSocket::disconnected,clientSocket,[=](){// 打印日志QString log = "客户端:" + clientSocket->peerAddress().toString() + ":" + QString::number(clientSocket->peerPort()) + "下线了";ui->listWidget->addItem(log);clientSocket->deleteLater(); // 下一个事件循环再删除});
}QString Widget::prase(QString &str)
{return str;
}
客户端部分
客户端界面:
初始化:
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("Tcp客户端");socket = new QTcpSocket(this);socket->connectToHost(ip,port); // 和服务器建立连接// 等待连接是否出错if(!socket->waitForConnected()){QMessageBox::critical(this,"连接出错",socket->errorString());exit(1);}// 处理连接可读就绪槽函数connect(socket,&QTcpSocket::readyRead,socket,[=](){QString response = socket->readAll();// 这里省略了解析过程QString log = "服务器说: " + response;ui->listWidget->addItem(log);});
}
按钮槽函数的设计
void Widget::on_pushButton_clicked()
{QString text = ui->lineEdit->text();if(text.isEmpty()) return;ui->lineEdit->clear();socket->write(text.toUtf8());// 打印日志QString log = "客户端说: " + text;ui->listWidget->addItem(log);
}
演示效果:
服务器:
这里也是支持多个客户端同时连接的。
客户端:
服务器能发送响应,客户端也能接收响应。
关于这里的一些细节
在TCP服务器处理请求这里,还是不够严谨的,因为TCP是字节流传输的,所以会存在数据“粘包”问题,这里我们并没有对其进行处理。这里严谨的做法应该是:将数据放到一个大的接收缓冲区中,然后约定好应用层协议的格式(报文定长,特殊字符等等)。
关于服务器那里,对于每一个客户端上线时,都会创建一个socket,随着客户端越来越多,如果这个socket不释放的话,就会造成内存泄漏,还有更严重的文件描述符泄漏。
我们可以通过delete手动释放,但是我们要考虑这个delete一定得被执行到,不会被return 异常这些情况而导致没有执行到。
Qt给了一种“半自动”的垃圾回收机制,
上述这个操作,不是立即销毁clientSocket,而是告诉Qt在下一轮事件循环中,再进行上述的销毁操作。
HTTP Client
Qt提供了HTTP客户但,但是没有提供HTTP服务器的库。
原因也很简单,一个正经的服务器是不需要图形化界面的,也就是不会用Qt来开发。
HTTPClient关键类主要是三个. QNetworkAccessManager , QNetworkRequest , QNetworkReply
QNetworkAccessManager 提供了 HTTP 的核⼼操作:
QNetworkRequest 表⽰⼀个 HTTP 请求(不含 body):
其中的 QNetworkRequest::KnownHeaders 是⼀个枚举类型, 常⽤取值:
QNetworkReply 表⽰⼀个 HTTP 响应. 这个类同时也是 QIODevice 的⼦类:
发送get请求
客户端界面:
这里我们以请求百度首页为例,得到的响应大概率是一个HTML格式的文件,这里我们的QplainTextEdit可以看到响应原始的模样。而QTextEdit天然会对HTML进行解析。
初始化:
slot槽函数
void Widget::on_pushButton_clicked()
{QUrl url = ui->lineEdit->text();if(url.isEmpty()) return;ui->lineEdit->clear();// 构建http请求对象QNetworkRequest request(url);// 获取http请求响应QNetworkReply* response = manager->get(request);// 构建槽函数来处理响应connect(response,&QNetworkReply::finished,response,[=](){if(response->error() == QNetworkReply::NoError){// 响应正确QString html = response->readAll();ui->plainTextEdit->setPlainText(html);}else{// 响应出错ui->plainTextEdit->setPlainText(response->errorString());}response->deleteLater(); // 记得销毁});
}
运行结果:
发送 POST 请求代码也是类似. 使⽤ manager->post() 即可
Qt音频
这里简单介绍一下Qt的音频
另外:使⽤ QSound 类时,需要添加模块:multimedia
它的核心API就一个:
先准备一个.wav格式的音频,然后可以用qrc管理起来。
示例:
#include <QSound> //添加⾳频头⽂件
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QSound *sound = new QSound(":/1.wav",this); //实例化对象connect(ui->btn,&QPushButton::clicked,[=](){sound->play(); //播放});
}
相关文章:
Qt-系统相关(2)多线程网络
Qt多线程 在 Qt 中,多线程的处理⼀般是通过 QThread类 来实现。 QThread 代表⼀个在应⽤程序中可以独⽴控制的线程,也可以和进程中的其他线程共享数据。 QThread 对象管理程序中的⼀个控制线程。 QThread 常⽤ API: 使用线程 关于创建线程…...
代码随想录算法训练营第五十九天|Day59 图论
Bellman_ford 算法精讲 https://www.programmercarl.com/kamacoder/0094.%E5%9F%8E%E5%B8%82%E9%97%B4%E8%B4%A7%E7%89%A9%E8%BF%90%E8%BE%93I.html 思路 #include <stdio.h> #include <stdlib.h> #include <limits.h>#define MAXM 10000 // 假设最大边数为1…...
SpringBoot集成ESAPI
官网地址:https://github.com/ESAPI/esapi-java-legacy 一、POM依赖 <dependency><groupId>org.owasp.esapi</groupId><artifactId>esapi</artifactId><version>2.6.0.0</version> <!-- Preferably the latest ver…...
Git 进程占用报错-解决方案
背景 大仓库,由于开发者分支较多,我们在使用 git pull 或 git push 等命令时(与远端仓库交互的命令),不知之前配置了什么,我的电脑会必现以下报错(有非常长一大串报错-不同分支的git进程占用报…...
python怎么设置静态变量
众所周知,Python语言并不支持静态变量,比如下面这样一个应用场景: void foo() {static int count 0;count ; } 在Python中无法自然实现这个功能。换个角度来看这个问题,函数中的静态变量其实可以看做是函数的一个内部变量&#x…...
【H2O2|全栈】Node.js(1)
目录 前言 开篇语 准备工作 ES6导入导出 导入 有名导出 匿名导出 Node概念 Node导入导出 导入 有名导出 匿名导出 Node常用模块 path模块 和路径有关的全局变量 常见方法 导入方法 fs模块 常见方法 导入方法 结束语 前言 开篇语 本系列博客主要分享Java…...
SJYP 24冬季系列 FROZEN CHARISMA发布
近日,女装品牌SJYP 2024年冬季系列——FROZEN CHARISMA已正式发布,展现了更加干练的法式风格。此次新品发布不仅延续了SJYP一贯的强烈设计风格和个性时尚,更融入了法式风情的干练元素,为消费者带来了一场视觉与穿着的双重盛宴。 …...
嵌入式硬件实战基础篇(四)多路直流稳压电源
设计一个多路直流稳压电源 要求设计制作一个多路输出直流稳压电源,可将220 V / 5 0HZ交流电转换为5路直流稳压输出。具体要求: 输出直流电压 12V, 5V;和一路输出3- 15V连续可调直流稳压电源: 输出电流Iom500mA; 稳压系数 Sr≤0.05;...
力扣_876. 链表的中间结点
力扣_876. 链表的中间结点 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释:链表只有一个中间结点,值为…...
shell脚本命令(一)
shell脚本命令(一) 一、Shell 基础知识 Shell的基本概念 定义: Shell 是操作系统中的命令解释器,位于用户与操作系统内核之间。它接收并解释用户输入的命令,将任务传递给操作系统内核执行,然后将执行结果…...
一文理解多模态大语言模型——上
作者:Sebastian Raschka 博士, 翻译:张晶,Linux Fundation APAC Open Source Evangelist 编者按:本文并不是逐字逐句翻译,而是以更有利于中文读者理解的目标,做了删减、重构和意译,…...
[代码随想录Day24打卡] 93.复原IP地址 78.子集 90.子集II
93.复原IP地址 一个合法的IP地址是什么样的: 有3个’.分割得到4个数,每个数第一个数不能是0,不能含有非法字符,不能大于255。 这个是否属于合法IP相当于一个分割问题,把一串字符串分割成4部分,分别判断每…...
去哪儿大数据面试题及参考答案
Hadoop 工作原理是什么? Hadoop 是一个开源的分布式计算框架,主要由 HDFS(Hadoop 分布式文件系统)和 MapReduce 计算模型两部分组成 。 HDFS 工作原理 HDFS 采用主从架构,有一个 NameNode 和多个 DataNode。NameNode 负责管理文件系统的命名空间,维护文件和目录的元数据信…...
controller中的参数注解@Param @RequestParam和@RequestBody的不同
现在controller中有个方法:(LoginUserRequest是一个用户类对象) PostMapping("/test/phone")public Result validPhone(LoginUserRequest loginUserRequest) {return Result.success(loginUserRequest);}现在讨论Param("login…...
排序算法思维导图
冒泡排序 def bubble_sort(alist):j 0while j < len(alist):i 0while i < len(alist) - 1:if alist[i] > alist[i1]:alist[i], alist[i1] alist[i1], alist[i]i 1j 1li [34,556,235,7,56,45,63,35,23,4,875] bubble_sort(li) print(li) 选择排序 def select_s…...
ZYNQ试用于哪些场景
ZYNQ系列SoC(System on Chip)由于其独特的处理器与FPGA(可编程逻辑)集成设计,非常适合应用于多种需要高性能、灵活性和低功耗的场景。 以下是一些ZYNQ特别适用的场景: 嵌入式系统:ZYNQ的ARM处理…...
【03】Selenium+Python 八种定位元素方法
操作元素,需要先查找定位到对应的元素。 查找单个元素:driver.find_element() 返回是一个web element 对象 查找多个元素:driver.find_elements() 返回是一个list对象 By 是 Selenium 中一个非常重要的类,用于定位网页元素。 使…...
Java 自动资源管理(Auto Resource Management)详解
Java 自动资源管理(Auto Resource Management)详解 在Java编程中,资源的正确管理是开发过程中一个非常重要的环节。如果资源(如文件、数据库连接、网络连接等)未被正确释放,可能会导致资源泄漏,…...
IT运维专家给年轻人一些职业上的建议
运维工作在现代企业中是非常重要的一环,保证系统的稳定性、可用性以及安全性对企业的正常运营至关重要。以下是我给年轻人的一些职业发展建议,希望能够帮助你们在运维领域找到方向并取得成功。 1. 夯实基础,扎实技术功底 精通操作系统与网络:运维工作需要深入理解操作系统…...
视图查询中投影裁剪规则的原理和解析 | OceanBase 查询优化
背景 在SQL查询中使用视图查询时,执行中可能会产生的较多的中间结果集。为了优化这类查询的执行,OceanBase 引入了投影裁剪规则。能够识别出父查询中未实际使用的列,并将这些列从视图查询的select列表中剔除,进而提升整体查询的性…...
利用Nginx在服务器上部署你的第一个静态页面
文章目录 序言Nginx常用功能1. 反向代理2.负载均衡轮询加权轮询IP_Hash Nginx配置文件结构安装并部署你的静态网页1. 安装(懒人直接看3)2.查看配置文件3.编写或放入自己的静态页面文件 序言 首先我们先来认识一下什么是Nginx源码 官网 Nginx (engine x) 是一个高性能的HTTP和…...
【拥抱AI】RAG如何通过分析反馈、识别问题来提高命中率
分析用户反馈并识别问题是持续优化RAG系统的重要步骤。这不仅可以帮助你了解系统的当前表现,还可以指导未来的改进方向。直接进入正题, 1. 收集用户反馈 方法 问卷调查:设计问卷,让用户填写他们对系统输出的满意度、易用性等方…...
内核模块签名验证
安装内核模块报错 今天在调试地平线 J6 板子时,安装自己编译的内核模块报错 roothobot:/tmp# insmod hobot_eth_j6.ko insmod: ERROR: could not insert module hobot_eth_j6.ko: Key was rejected by service前两天刚在 x86 电脑上解决过这个问题,参…...
C++模板(入门)
文章目录 泛型编程函数模板函数模板的概念函数模板格式函数模板的原理函数模板的实例化隐式实例化显示实例化模板参数的匹配 类模板为什么有类模板类模板的定义格式类模板的实例化Stack模板类的简单实现(不涉及深拷贝) 模板的注意问题模板不支持分离编译…...
如何在Python中进行数学建模?
数学建模是数据科学中使用的强大工具,通过数学方程和算法来表示真实世界的系统和现象。Python拥有丰富的库生态系统,为开发和实现数学模型提供了一个很好的平台。本文将指导您完成Python中的数学建模过程,重点关注数据科学中的应用。 数学建…...
C++优质学习资源汇总
1 学懂C语言-C核心编程精讲 学懂C语言-C核心编程精讲 该课程基本把面试所需要的C常用的网络等教程均进行讲解,满足基本需求...
心情追忆:构建支付模块的五个基本接口设计
之前,我独自一人开发了一个名为“心情追忆”的小程序,旨在帮助用户记录日常的心情变化及重要时刻。我从项目的构思、设计、前端(小程序)开发、后端搭建到最终部署。经过一个月的努力,通过群聊分享等方式,用…...
数据库导论
data 数据是数据库中存储的基本数据,描述事物的符号称为数据。 DB 数据库是长期存储在计算机内,有组织,可共享的大量数据的集合。数据库中的数据按照一定的数据模型组织,描述和存储,具有较小的冗余度,较…...
echarts使用示例
柱状图折线图 折柱混合:https://echarts.apache.org/examples/zh/editor.html?cmix-line-bar option {title:{show: true},tooltip: {trigger: axis,axisPointer: {type: cross,crossStyle: {color: #999}}},toolbox: {feature: {dataView: { show: true, readOnl…...
选修课(Java Python JS C++ C )
题目描述 现有两门选修课,每门选修课都有一部分学生选修,每个学生都有选修课的成绩,需要你找出同时选修了两门选修课的学生,先按照班级进行划分,班级编号小的先输出,每个班级按照两门选修课成绩和的降序排序,成绩相同时按照学生的学号升序排序。 输入描述 第一行为第…...
《解锁 C++数据读写秘籍:赋能人工智能训练》
在人工智能蓬勃发展的时代,数据无疑是驱动模型学习与成长的核心燃料。而 C作为一门高性能编程语言,在处理人工智能训练所需数据集的读取与写入时,有着独特的优势与关键作用。高效地运用 C进行数据操作,能够显著加速训练进程&#…...
23种设计模式-外观(Facade)设计模式
文章目录 一.什么是外观设计模式?二.外观设计模式的特点三.外观设计模式的结构四.外观设计模式的优缺点五.外观设计模式的 C 实现六.外观设计模式的 JAVA 实现七.代码解析八.总结 类图: 外观设计模式类图 一.什么是外观设计模式? 外观设计模…...
ReactPress(阮一峰推荐工具):一款基于Next.js的免费开源博客CMS系统
ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 此项目是用于构建博客网站的,包含前台展示、管理后台和后端。 此项目是基于 React antd NestJS NextJS MySQL 的,项目已经开源,项目地址在 …...
什么是缓存击穿?如何避免之布隆过滤器
缓存击穿(Cache Penetration)是分布式系统和缓存使用中的一个常见问题,布隆过滤器在解决缓存击穿问题时非常有用。接下来我会介绍缓存击穿的概念以及布隆过滤器在解决该问题中的应用。 什么是缓存击穿? 缓存击穿是指当大量的客户…...
React 第八节组件生命周期钩子-类式组件,函数式组件模拟生命周期用法
概述 React组件的生命周期可以分为三个主要阶段: 挂载阶段(Mounting):组件被创建,插入到DOM 树的过程; 更新阶段(Updating):是组件中 props 以及state 发生变化时&#…...
java虚拟机——如何排查jvm问题
在项目中排查JVM问题是一个系统性的过程,涉及到多个工具和方法。以下是一些常见的步骤和工具,可以帮助你有效地诊断和解决JVM相关的问题: 1. 监控和日志 日志分析 JVM日志:启用JVM的日志记录功能,查看垃圾收集日志、…...
Altium Designer PCB设计检查工具1
此工具最大的特点是不需要联网,完全使用本地的计算资源即可实现检查统计操作,可用于不能联网的应用场景中。此工具支持多种计算加速方法,支持调用CUDA显卡进行数据处理,此功能需要计算机安装Matlab 2016以上版本,并需要…...
统计词频
目标:统计词频 从文件1.txt ,读取内容,保存在一个字符串中统计字符串中,每个单词出现的频率对结果进行排序把最后的结果写入一个新的文件 import java.io.PrintWriter import scala.io.Source//知识点: //1.字符串&a…...
串,数组,广义表相关知识点
串 一.串的储存 1.基本概念 2.顺序储存 3.链式储存 二. 串的模式匹配算法 1.BF算法 将主串的第pos个字符和模式的第一个字符比较, 若相等,继续逐个比较后续字符; 若相等,继续逐个比较后续字符; 若不等,…...
Leetcode 131 Palindrome Partition
题意 把一个字符串分割成多个回文字符串的partition,返回所有的可能partion 链接 https://leetcode.com/problems/palindrome-partitioning/description/ 思考 这只是dfs套了一个回文问题 题解 dfs每次截取一段字符串,判断是否是回文 退出条件是遍…...
git使用文档手册
创建一个本地代码工作空间,比如这里使用test目录作为工作目录 针对仓库地址 http://192.168.31.125:9557/poxiaoai-crm/project-crm.git。 1. 安装 Git 确保您的系统已经安装了 Git。如果未安装,请根据操作系统访问 Git 官网 下载并安装。 验证安装 …...
开发需求总结19-vue 根据后端返回一年的数据,过滤出符合条件数据
需求描述: 定义时间分界点:每月26号8点,过了26号8点则过滤出data数组中符合条件数据下个月的数据,否则过滤出当月数据 1.假如现在是2024年11月14日,那么过滤出data数组中日期都是2024-11月的数据; 2.假如…...
android 安全sdk相关
前述 在网上有看到许多android安全sdk相关的内容,有重复的也有比较新鲜的内容,这里做一个整体的合集,以及后续又看到一些比较新的东西会一起放在这里。 android内sdk目前可以分为以下几个部分(有一些部分可能会存在一些重合&#…...
ChemBench—— 探索大语言模型在化学领域的新基准框架是否胜过化学专家
概述 大规模语言模型是一种机器学习模型,通过学习大量文本来生成文本。这些模型的能力正在迅速提高,现在已经可以通过美国国家医学考试。它们还可以与网络搜索和合成规划器等工具结合使用,自主设计化学反应和进行实验。 一些人认为这些模型…...
[SWPUCTF 2021 新生赛]Do_you_know_http
访问告诉我们要用WLLM 浏览器模式访问 import requestsurl http://node7.anna.nssctf.cn:23148/hello.php # 替换为题目提供的URL headers {User-Agent: WLLM } response requests.get(url, headersheaders) print(response.text)import requestsurl http://node7.anna.n…...
Flink--API 之 Source 使用解析
目录 一、Flink Data Sources 分类概览 (一)预定义 Source (二)自定义 Source 二、代码实战演示 (一)预定义 Source 示例 基于本地集合 基于本地文件 基于网络套接字(socketTextStream&…...
vscode可以编译通过c++项目,但头文件有红色波浪线的问题
1、打开 VSCode 的设置,可以通过快捷键 Ctrl Shift P 打开命令面板,然后搜索并选择 “C/C: Edit Configurations (JSON)” 命令,这将在 .vscode 文件夹中创建或修改 c_cpp_properties.json 文件 {"configurations": [{"name…...
CTF之密码学(培根密码)
培根密码,又名倍康尼密码(Bacons cipher),是由法兰西斯培根发明的一种隐写术,属于密码学领域的一种替换密码。以下是关于培根密码的详细介绍: 一、原理 培根密码本质上是一种二进制密码,但它没…...
摄像头原始数据读取——V4L2(mmap模式,V4L2_MEMORY_MMAP)
摄像头原始数据读取——V4L2(mmap模式,V4L2_MEMORY_MMAP) 内存映射模式,是将设备在内核态申请的用于存储视频数据的物理内存映射到用户空间,使得用户应用程序可以直接访问和操作设备数据物理内存,避免了数据的拷贝。因此采集速度较快&#x…...
Ubuntu20.04下安装Matlab2018
Ubuntu20.04下安装Matlab2018 首先需要下载三个文件 挂载第一个镜像文件 先进入到终端,在空白处点击在终端打开 然后输入以下两个命令: mkdir ~/matlab //用户主目录下新建文件夹 matlab sudo mount -o loop Matlab911R2021b_Lin64.iso ~/matlab //将…...