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

OPC Client第3讲(wxwidgets):wxFormBuilder;基础框架;事件处理

wxwidgets开源桌面软件框架使用 - 哔哩哔哩

wxwidgets跨平台GUI框架使用入门详解_哔哩哔哩_bilibili

一、wxwidgets配置【见上一讲五、】

二、安装wxFormBuilder 

1、wxFormBuilder介绍、安装

wxFormBuilder是一个开源的GUI设计工具,支持C++、Python等语言,提供所见即所得的界面设计。

虽然事件处理需要手动实现,但自动生成的代码能作为基础模板。该工具适用于快速构建如登录页面等简单的GUI应用。

第四章文本输入控件TextCtrl_哔哩哔哩_bilibili

wxFormBuilder使用介绍-CSDN博客

2、 wxFormBuilder启动

在上图的终端里输入下述命令,启动wxFormBuilder:

cd wxFormBuilder

_install/wxFormBuilder

3、自动生成的代码,复原工程代码

1>可以自动生成c++、python等代码

2>复原工程代码

法1》 保存为.fbp文件

.fbp 文件是 wxFormBuilder 项目的文件格式,用于保存使用 wxFormBuilder 设计的界面布局和相关设置。

法2》file->Import XRC...

.xrc 文件是 wxWidgets 库使用的一种资源文件格式,用于以 XML 形式描述用户界面元素。

把上图自动生成的XRC文件复制粘贴,另存为一个新的.xrc文件,如下图

然后再通过下图的file->Import XRC...导入上图的.xrc文件

4、预览窗口

View->XRC window

5、导出代码

.fbp 文件是 wxFormBuilder 项目的文件格式,用于保存使用 wxFormBuilder 设计的界面布局和相关设置。

1>导出代码方法:file->Generate Code

会将生成的源代码(.c/.cpp)保存到工程文件(.fbp)的目录下,文件名为第一步的配置。

三、wxwidgets基础框架

前提:理解多态中的虚函数

53 类和对象-多态-多态的基本语法_哔哩哔哩_bilibili

共分为六个部分,见下述代码一、到六、【也是写代码的逻辑顺序】

注意:宏定义可以写在前面

        IMPLEMENT_APP(MainApp);可以写在MainApp::OnInit实现函数之前,只要写在MainApp::OnInit()声明之后就行!

1、不把头文件和实现文件分开

#include<wx/wx.h>// 导入系统路径wx文件夹下的wx.h头文件// 包含 wxWidgets 的核心头文件,提供 GUI 应用程序的基本功能。// 一、每一个wxWidgets程序都需要定义一个wxApp类的子类,并且需要创建并且只能创建一个这个类的实例,这个实例控制着整个程序的执行
class MainApp : public wxApp
{
public:// 你的这个继承自wxApp的子类至少需要定义一个OnInit函数,当wxWidgets准备好运行你写的代码的时候,它将会调用这个函数// 为什么OnInit是虚函数?:目的是允许子类重写这个函数,从而实现特定的初始化逻辑virtual bool OnInit();
};// 三、自定义主窗口类InitFrame,内容为:
//		1、有一个构造函数。目的为当自动调用父函数的构造函数时,传入自定义的窗口的标题
//		2、两个用来把菜单命令和C++代码相连的事件处理函数
//		3、还有一个宏来声明事件表
class InitFrame : public wxFrame
{
public:InitFrame(const wxString& title);void OnQuit(wxCommandEvent& event);void OnAbout(wxCommandEvent& event);
private:DECLARE_EVENT_TABLE()//声明事件表//在类的实现文件中使用 BEGIN_EVENT_TABLE 和 END_EVENT_TABLE 宏,并列出具体的事件绑定【略】
};//四、创建MainApp的实例,提供应用程序的入口点(里面有 main() 函数,调用运行MainApp类里的OnInit函数)
//	只要声明了MyApp,就可以用IMPLEMENT_APP(MainApp);创建实例了
//实现应用程序的入口点,并告诉框架需要创建哪个 wxApp 子类的实例
IMPLEMENT_APP(MainApp)//五、使用MainApp的实例【有了这一行就可以使用MainApp& wxGetApp了()】
//当wxWidgets创建这个MainApp类的实例的时候,会将创建的结果赋值给一个全局变量wxTheApp,类型为 wxApp*。它是所有 wxApp 实例的指针引用。
//【wxTheApp作用:通过 wxTheApp,你可以访问应用程序的全局状态或调用 wxApp 提供的方法】
//		法1、DECLARE_APP(MainApp);
//		法2、强制类型转换后使用子类方法
//	提示:如果直接使用 wxTheApp,因为不是虚函数,所以编译器只会调用基类wxApp的方法,而不是MainApp里的方法!
DECLARE_APP(MainApp)// 二、根据虚函数的定义,子类要重写虚函数
// 在这个OnInit函数中,通常应该作的事情包括:创建至少一个窗口实例,对传入的命令行参数进行解析,为应用程序进行数据设置和其它的一些初始化的操作.
//		如果这个函数返回真,wxWidgets将开始事件循环用来接收用户输入并且在必要的情况下处理这些输入。
//		如果OnInit函数返回假,wxWidgets将会释放它内部已经分配的资源,然后结束整个程序的运行。
bool MainApp::OnInit()
{//1、创建窗口实例:需要用到自定义主窗口类InitFrameInitFrame *frame = new InitFrame(wxT("wxWidgets App"));//传入自定义的窗口的标题"wxWidgets App"//wxT这个宏:作用是让代码兼容Unicode模式frame->Show(true);//显示窗口(即让窗口可见)return true;
}//六、接下来就是处理 自定义主窗口类InitFrame【略,具体见开发文档】
//	1、InitFrame构造函数的实现
//	2、里面的OnQuit和OnAbout函数的实现
//	3、在类的实现文件中使用 BEGIN_EVENT_TABLE 和 END_EVENT_TABLE 宏,并列出具体的事件绑定。
//类的事件表InitFrame//实现六、3、
BEGIN_EVENT_TABLE(InitFrame, wxFrame)EVT_MENU(wxID_ABOUT, InitFrame::OnAbout)EVT_MENU(wxID_EXIT, InitFrame::OnQuit)
END_EVENT_TABLE()//实现六、2、
void InitFrame::OnAbout(wxCommandEvent& event)
{wxString msg;msg.Printf(wxT("Hello and welcome to %s"),wxVERSION_STRING);wxMessageBox(msg, wxT("About Minimal"),wxOK | wxICON_INFORMATION, this);
}//实现六、2、
void InitFrame::OnQuit(wxCommandEvent& event)
{//释放主窗口Close();
}//实现六、1、
InitFrame::InitFrame(const wxString& title): wxFrame(NULL, wxID_ANY, title)
{//创建菜单条wxMenu *fileMenu = new wxMenu;//添加“关于”菜单项wxMenu *helpMenu = new wxMenu;helpMenu->Append(wxID_ABOUT, wxT("&About...\tF1"),wxT("Show about dialog"));fileMenu->Append(wxID_EXIT, wxT("E&xit\tAlt−X"),wxT("Quit this program"));//将菜单项添加到菜单条中wxMenuBar* menuBar = new wxMenuBar();menuBar->Append(fileMenu, wxT("&File"));menuBar->Append(helpMenu, wxT("&Help"));//然后将菜单条放置在主窗口上..SetMenuBar(menuBar);// 创建一个状态条来让一切更有趣些。CreateStatusBar(2);SetStatusText(wxT("Welcome to wxWidgets!"));
}

2、分开,有InitFrame.h/.cpp

3、区别父类、父窗口

1>父类:就是C++面向对象编程(OOP)中的继承关系

2>父窗口:GUI 编程中的容器关系

4、窗口的基础知识

内容太多,直接看文档。如果想要搜索某个控件,直接在文档里ctrl+f

 

 四、在项目中的用法

1、项目代码运行过程

1>点击代码程序运行

2>main.cpp内部使用wxWidgets 库,构建显示InitFrame定义的配置窗口,窗口如下图

InitFrame.h/.cpp 作用:读取配置文件,填写或者修改配置信息,执行自己的逻辑,修改配置文件,然后将配置信息作为参数传递给下一个窗口,并关闭当前窗口。

3>切换窗口显示MainFrame窗口,窗口如下图

MainFrame.h/.cpp 作用:将配置信息分别对内部的数据库、连接的机台IP、缓冲区设置等进行初始化,初始化完成之后显示主窗口,在定时器中执行批量连接并订阅节点,完成之后开启定义的线程用于轮询连接的机台,至此主要的框架就开始运行。

4>监听订阅数据的变化,以及机台的连接状态和socket的状态,都有可以自动处理的逻辑。

2、写代码,对应二、中框架

运行代码,出现下述窗口

3、补充完整 InitFrame.h/.cpp:见下一章

即实现下述窗口

五、wxWidgets事件处理——如何添加新功能?

1、静态事件处理方法(最常用,但5、动态绑定更方便)

1>原理:大多数与用户交互的核心组件(如窗口、控件等)都继承自 wxEvtHandler,因为它们需要支持事件处理机制

2>举例,原则如下

下图中的MyFrame就是二、中的InitFrame

1》所有的事件处理函数拥有相同的形式【如下图2里的红色标记】

所有的事件处理函数返回值都是void,都不是虚函数,都只有一个事件对象作为参数。

  • 事件对象参数的类型是随这个处理函数要处理的事件的变化而变化的。
    • 例如简单控件(比如按钮)的事件命令处理函数和菜单命令事件的处理函数的参数都是wxCommandEvent类型;
    • 而size事件(这个事件通常是由用户改变窗口的客户区尺寸而引起的)处理函数的参数则是wxSizeEvent的类型。
2》举例

​3>运行过程【例子见3、4>】

当点击按钮后,会通过wxID查找其绑定的事件。

        如果绑定的事件是Command事件,在自己的父类里面找不到这个事件的话,可以被递归地去父窗口里面查找这个事件;需要在后面加上wxEvent::Skip函数。

        注意其它事件(例如wxSizeEvent,wxPanel等)是不会去父窗口里面查找的,只会在自己的父类里面查找;需要在后面加上wxEvent::Skip函数。

  • 这些事件之所以不会传递给其父窗口,是因为这些事件仅对产生这个事件的窗口才有意义。
  • 举例来说,一个子窗口的重绘事件发送给它的父亲,其实是没有任何意义的。
  • 如果需要传递给父窗口,可以通过 wxPostEvent (GetParent() ,wxCommandEvent(event.GetEventTvpe());传递

3、过滤某个事件【继承自wxTextCtrl类,EVT_KEY_DOWN宏,wxEvent::Skip函数】

1>原理:可以 过滤某些按键事件 以便 本地原生的编辑框控件 不处理这些按键。

wxEvent::Skip函数:让事件继续传递

2>使用步骤

1》需要实现一个继承自wxTextCtrl的新的类,

2》然后在其事件表中使用EVT_KEY_DOWN事件映射宏。

3》过滤所有的你不想要的按键事件,wxEvent::Skip函数来提示事件处理过程对于其中的某些按键事件应该继续寻找其父类的事件表.

3>举例

4>Command 事件的传播顺序:控件 -> 父类 -> 父窗口(利用 wxEvent::Skip)

Command事件:1、3>里的

从下述链接14:27开始看

第三章事件处理_哔哩哔哩_bilibili

1》class FirstButton : public wxButton

上图对应的.cpp文件如下,加上event.Skip;

        定义了按钮的响应事件:wxID为8000,绑定的事件为OnButton

2》class SecondButton : public FirstButton

上图对应的.cpp文件如下,加上event.Skip;

        定义了按钮的响应事件:wxID为8000,绑定的事件为OnButton

3》调用2》中的SecondButton

MyFrame.h主框架里面定义了SecondButton

上图对应的.cpp文件如下。

《1》定义了按钮的响应事件:wxID为8000,绑定的事件为OnButton

里面也加上了event.Skip

《2》在MyFrame.cpp的构造函数中创建了SecondButton的实例

如果用户点击主界面的"Button"按钮,通过wxID='8000'查找其绑定的事件SecondButton,就会先进入SecondButton里查找wxID为8000的事件;

同时,mButton->Create(this, 8000,"BUTTON")的第一个参数指的是父窗口(即MyFrame)

4》运行代码,查看结果

代码先进入MyFrame.h主框架里面,运行MyFrame的构造函数,显示出下述的窗口界面

        由3》《2》可知,其中的"Button"按钮是绑定在SecondButton上的,并且设定了其wxID='8000'

《1》点击上图中的按钮BUTTON后,就会先进入SecondButton里查找其wxID=‘8000’的事件处理器,如下图

《2》由于class SecondButton : public FirstButton,且里面还有event.Skip:所以 Command事件 继续传递到父类FirstButton。

在父类FirstButton里查找其wxID=‘8000’的事件处理器。

点击上图的OK,出现下图

《3》由于class FirstButton : public wxButton,且里面还有event.Skip:所以 Command事件 会继续传递到父类wxButton。父类wxButton没有输出,至此父类阶段结束。

《5》当所有父类处理完成后,事件进入父窗口传播阶段

在父类阶段结束后,由于 SecondButton 在 MyFrame.h主框架的构造函数中,说明了其父窗口是 MyFrame(见3》),所以开始父窗口的传递

在父窗口MyFrame里查找其wxID=‘8000’的事件处理器。

点击上图的OK,出现下图

5》由此,证明了 1、3>中的 Command 事件的传播顺序:控件 -> 父类 -> 父窗口(利用 wxEvent::Skip函数)

如果不想往上传,不加wxEvent::Skip函数就行了

4、挂载事件表【略】

wxWindow::PopEventHandler和wxWindow::PopEventHandler

5、动态事件处理方法(即动态绑定:Bind/Unbind;Connect/Disconnect)

前面我们讨论的事件处理方法,都是静态的事件表,这也是我们处理事件最常用的方式。

动态绑定:在运行期改变事件表的映射关系

1>区别动态绑定和静态绑定

1》什么叫动态绑定在“运行时”?

核心:动态绑定在“运行时”指可以对同一个事件绑定新的事件处理器(通过 Unbind() 和 Bind() 动态绑定到另一个新的事件处理器);但是静态绑定的一个事件只能绑定一个事件处理器,一旦编译完成就不能更改。

2>动态绑定两种方法:Bind/Unbind;Connect/Disconnect

 MyFrame.h主框架如下图

上图对应的.cpp文件如下。

1》动态绑定法1:Bind/Unbind【更推荐】

法《1》

法《2》直接用Lambada表达式

2》动态绑定法2:Connect/Disconnect

《1》不需要手动调用wxEvtHandler::Disconnect函数,这个函数将在窗口类被释放的时候自动被调用。

《2》如果事件处理函数的 参数类型是wxXYZEvent,那么其处理函数的类型就应该用wxXYZEventHandler宏进行强制转换

在 wxWidgets 中,事件处理函数的类型需要与事件的实际参数类型匹配。为了确保类型安全和正确性,通常会使用 wxXYZEventHandler 宏将函数指针强制转换为对应的事件处理器类型。

  • Bind/Unbind 不需要显式地使用 wxXYZEventHandler 宏。
    • 这是因为 Bind/Unbind 使用了 C++ 的模板机制,能够自动推导出事件处理器的类型,从而避免了手动强制类型转换的需求。
    • Connect/Disconnect 是较老的方法,没有模板支持,必须显式指定事件处理器的类型。
  • 例如 wxMouseEventHandler 或 wxCommandEventHandler

《3》举例

6、窗口标识符【略】

相关文章:

OPC Client第3讲(wxwidgets):wxFormBuilder;基础框架;事件处理

wxwidgets开源桌面软件框架使用 - 哔哩哔哩 wxwidgets跨平台GUI框架使用入门详解_哔哩哔哩_bilibili 一、wxwidgets配置【见上一讲五、】 二、安装wxFormBuilder 1、wxFormBuilder介绍、安装 wxFormBuilder是一个开源的GUI设计工具&#xff0c;支持C、Python等语言&#…...

20250418项目接入scalar

scalar官网地址 scalar-dotnet文档地址 1. 引入nuget包 这里必须是2.1.* 以上 否则不支持多库 <PackageReference Include"Scalar.AspNetCore" Version"2.1.16" />2. 引入命名空间 using Scalar.AspNetCore;3. 使用scalar var documents new[] {…...

数控铣床自动上下料机械手控制装置设计

一、引言 在数控铣床加工过程中&#xff0c;实现自动上下料能够提高生产效率、降低劳动强度、减少人为因素对加工质量的影响。设计一款高效、可靠的数控铣床自动上下料机械手控制装置&#xff0c;是实现数控铣床自动化加工的关键。 二、控制装置设计要求 自动化程度&#xf…...

STM32F407的引脚说明

当笔记站 引脚说明在STM32F407数据手册中的48页到71页&#xff0c;下载地址&#xff1a; https://www.stmcu.com.cn/Designresource/detail/document/696193?auto_download1 以下是在图片转表格得到的东西 Pinouts and pin description …...

STM32单片机入门学习——第41节: [12-1] Unix时间戳

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.18 STM32开发板学习——第41节: [12-1] Unix时间戳 前言开发板说明引用解答和科普一…...

使用Pydantic优雅处理几何数据结构 - 前端输入验证实践

使用Pydantic优雅处理几何数据结构 - 前端输入验证实践 一、应用场景解析 在视频分析类项目中&#xff0c;前端常需要传递几何坐标数据。例如智能安防系统中&#xff0c;需要接收&#xff1a; 视频流地址&#xff08;rtsp_video&#xff09;检测区域坐标点&#xff08;point…...

【Hot100】41. 缺失的第一个正数

目录 引言缺失的第一个正数初始理解问题方法一分析&#xff1a;排序后遍历方法二分析&#xff1a;辅助数组寻找满足条件的解法代码实现验证例子复杂度分析 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;【…...

FairMOT算法详解

FairMOT(Fairness in Detection and Re-Identification for Multi-Object Tracking)是一种基于联合学习(Joint Learning)的多目标跟踪(MOT)算法,由中科院自动化所团队提出。其核心思想是通过单阶段网络同时完成目标检测和重识别(Re-ID)特征提取,解决了传统两阶段方法…...

java线程池原理及使用和处理流程

实际测试使用如下&#xff1a; package com.study;import java.util.concurrent.*;/*** 线程池作用&#xff1a;* 1、线程的复用* 2、资源管理* 3、任务调度* --------------执行过程--------------* 第1-3个任务进来时&#xff0c;直接创建任务并执行* 第4-8个任务进来时&…...

奖学金排序问题

#include <bits/stdc.h> using namespace std;const int N 305; // 定义最大学生人数为305// 定义学生结构体&#xff0c;包含语文、数学、英语成绩、总分以及学生编号 struct node {int yuwen; // 语文成绩int mat_h; // 数学成绩int english; // 英语成绩i…...

useMemo + memo + useContext 性能优化实战:从无感重渲染到丝滑体验

在 Vue 中我们可能依赖 Vuex computed 进行状态共享和性能优化&#xff0c;而在 React 里呢&#xff1f;不需要用 Redux&#xff0c;靠 useContext、memo、useMemo 三剑客就能构建高性能组件通信方案&#xff01; &#x1f9e9; useContext 再回顾&#xff1a;状态共享不等于性…...

集合框架--Set集合详解

set集合 set 系列集合特点&#xff1a; 无序&#xff1a;存或取的元素的顺序可能是一致的&#xff0c;也可能不是 不重复&#xff1a;集合中不能存储重复的元素&#xff0c;我们可以利用这个特性去重 无索引&#xff1a;我们不可以通过索引获得set中的每一个元素 Set接口没…...

git -- 对远程仓库的操作 -- 查看,添加(与clone对比),抓取和拉取,推送(注意点,抓取更新+合并的三种方法,解决冲突,对比),移除

目录 对远程仓库的操作 介绍 查看 (git remote) 介绍 查看详细信息 添加(git remote add) 介绍 与 git clone对比 从远程仓库中抓取与拉取 抓取(git fetch) 拉取(git pull) 推送(git push) 介绍 注意 抓取更新合并的方法 git fetch git merge 解决冲突 git …...

Hadoop的三大结构及其作用

Hadoop 的三大核心结构及其作用如下&#xff1a; 1. 分布式文件系统&#xff08;HDFS&#xff0c;Hadoop Distributed File System&#xff09; 作用&#xff1a; 海量数据存储&#xff1a;提供高吞吐量、高容错性的分布式存储能力&#xff0c;支持存储 TB/PB 级的大规模数据…...

Java学习笔记--多态:多态的介绍,多态的基本使用,多态的条件下成员的访问特点,多态的好处

目录 1.多态的介绍 2.多态的基本使用 ​编辑 3.多态的条件下成员的访问特点 3.1成员变量 3.2成员方法 4.多态的好处(为什么学多态) 1.问题描述: 2.多态方式和原始方式new对象的优缺点: 一.多态的介绍 1.前提:a.必须有子父类继承或者接口实现关系b.必须有方法的重写(没…...

使用Python设置Excel单元格边框

在数据驱动的业务场景中&#xff0c;自动化设置Excel单元格边框成为提升数据处理效率的关键环节。通过程序化控制边框样式&#xff0c;不仅能确保海量报表格式的统一性&#xff0c;还能通过粗细、虚实等视觉元素强化数据逻辑层次。当面对动态更新的分析报告时&#xff0c;代码驱…...

ES中常用的Query和查询作用,以及SpringBoot使用实例

ES中常用的Query和查询作用&#xff0c;以及 SpringBoot 使用实例 文章目录 ES中常用的Query和查询作用&#xff0c;以及 SpringBoot 使用实例MatchAllQueryTermQueryBoolQueryRangeQueryMatchQueryMultiMatchQueryTermsQueryPrefixQueryWildcardQueryRegexpQueryFuzzyQueryDis…...

美信监控易告警:功能强大

美信监控易是一款功能强大的运维管理软件&#xff0c;其告警功能在保障系统稳定运行方面发挥着重要作用。 一、运维行业背景 随着信息技术的快速发展&#xff0c;企业的信息化程度越来越高&#xff0c;对 IT 系统的依赖也日益增强。IT 系统的稳定运行直接关系到企业的业务正常…...

字符串系列一>最长回文子串

目录 题目&#xff1a;解析&#xff1a;代码&#xff1a; 题目&#xff1a; 链接: link 解析&#xff1a; 代码&#xff1a; class Solution {public String longestPalindrome(String s) {char[] ss s.toCharArray();int n ss.length;int begin 0;//返回结果的起始字符串…...

CAPL编程系列_02

1_CAPL 中的运算符 在CAPL&#xff08;CANoe/CANalyzer Programming Language&#xff09;中&#xff0c;运算符用于执行各种运算操作&#xff0c;类似于其他编程语言。CAPL中的运算符可以分为以下几类&#xff1a; 1. 算术运算符 算术运算符 加法运算符 - 减法运算符*乘法运…...

AI Agents系列之构建多智能体系统

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…...

FPGA学习——DE2-115开发板上设计波形发生器

1. 实验目的 掌握直接数字频率合成&#xff08;DDS&#xff09;技术的基本原理和应用。使用DE2-115开发板实现正弦波和方波的生成。使用SignalTap II嵌入式逻辑分析仪测试输出波形的离散数据。 2. 实验原理 DDS技术&#xff1a;通过相位累加器生成相位信息&#xff0c;结合波…...

51单片机实验二:数码管静态显示

目录 一、实验环境与实验器材 二、实验内容及实验步骤 1.单个数码管显示 2.六个数码管依次从0~F变换显示 3.proteus仿真 一、实验环境与实验器材 环境&#xff1a;Keli&#xff0c;STC-ISP烧写软件,Proteus. 器材&#xff1a;TX-1C单片机&#xff08;STC89C52RC…...

JavaScript性能优化实战指南

1. 引言 JavaScript作为现代Web开发的核心技术&#xff0c;为网页带来了丰富的交互性和动态功能。然而&#xff0c;随着Web应用日益复杂&#xff0c;JavaScript代码的性能成为影响用户体验的关键因素。性能不佳的JavaScript可能导致页面加载缓慢、交互卡顿、甚至浏览器无响应&…...

POSIX 信号量(Semaphore)

一、POSIX 信号量基础 1. 什么是信号量&#xff1f; 信号量 是一种同步机制&#xff0c;用于控制对共享资源的访问。它通过一个整数值表示可用资源的数量&#xff0c;支持两种原子操作&#xff1a; P操作&#xff08;Wait&#xff09;&#xff1a;尝试减少信号量值&#xff0…...

深度学习驱动下的字符识别:挑战与创新

一、引言 1.1 研究背景 深度学习在字符识别领域具有至关重要的地位。随着信息技术的飞速发展&#xff0c;对字符识别的准确性和效率要求越来越高。字符识别作为计算机视觉领域的一个重要研究方向&#xff0c;其主要目的是将各种形式的字符转换成计算机可识别的文本信息。近年…...

DOM TreeWalker API 详解

DOM TreeWalker API 详解 TreeWalker API 是 DOM 中一个强大但相对较少使用的功能&#xff0c;它提供了一种有效遍历文档树的方式。它比手动递归或使用简单的节点导航方法更加灵活和高效。 TreeWalker 基本概念 TreeWalker 对象可以让你按照指定的过滤条件&#xff0c;以特定…...

深度学习| Deep Snake环境配置+训练+预测评估(超全面)

前言:Deep Snake是一个比较经典结合了轮廓的深度学习分割方法,但是去实际运行Deep Snake项目的时候遇到了很多问题。这篇文章把Deep Snake从环境配置、训练到预测评估,都做了详细的教程,还补充了一些相关的知识点。 Deep Snake配置和运行 Deep Snake信息数据集COCOMask-&g…...

NHANES指标推荐:CMI

文章题目&#xff1a;Association between cardiometabolic index and biological ageing among adults: a population-based study DOI&#xff1a;10.1186/s12889-025-22053-3 中文标题&#xff1a;成年人心脏代谢指数与生物衰老之间的关系&#xff1a;一项基于人群的研究 发…...

非比较排序——计数排序

计数排序 计数排序是非比较排序 void CountSort(int *a,int n) {//找范围int mina[0],maxa[0];for(int i0;i<n;i){if(a[i]<min){mina[i];}if(a[i]>max){mina[i];}}int rangemax-min1;//创建计数用的数组int *count(int *) malloc(range* sizeof(int));//计数数组的元…...

spring cloud gateway前面是否必须要有个nginx

在 **"客户端 → Nginx (前置限流) → Spring Cloud Gateway → 微服务(Sentinel 熔断限流)"** 的架构中&#xff0c;**Spring Cloud Gateway 前面并不强制要求必须有 Nginx**&#xff0c;是否需要取决于具体场景。以下是详细分析&#xff1a; 一、必须使用 Nginx 的…...

复现SCI图像增强(Toward fast, flexible, and robust low-light image enhancement.)

运行train.py报错 > File "/home/uriky/桌面/SCI-main/SCI-main/train.py", line 105, in main > train_queue torch.utils.data.DataLoader( File "/home/uriky/anaconda3/envs/AA/lib/python3.8/site-packages/torch/utils/data/dataloader.py&q…...

Linux 进程

文章目录 1. 冯诺依曼体系结构1.1 什么是冯诺依曼体系结构1.2 为什么选择冯诺依曼结构 2. 操作系统2.1 操作系统是什么2.2 操作系统如何对硬件资源进行管理2.3 计算机的层状体系结构 3. 进程3.1 进程是什么3.2 进程的相关属性3.3 在Linux中了解进程3.3.1 查看进程3.3.2 子进程由…...

TVM计算图分割--Collage

1 背景 为满足高效部署的需要&#xff0c;整合大量优化的tensor代数库和运行时做为后端成为必要之举。现在的深度学习后端可以分为两类&#xff1a;1&#xff09;算子库(operator kernel libraries)&#xff0c;为每个DL算子单独提供高效地低阶kernel实现。这些库一般也支持算…...

Liunx知识点

1./dev&#xff1a;是系统设备文件存放位置 /home&#xff1a;是普通用户存放目录 /etc&#xff1a;大部分配置文件的存放目录 /mnt&#xff1a;挂载服务需要的目录 /tmp&#xff1a;存放临时文件 /boot&#xff1a;启动文件 /root&#xff1a;root用户存放目录 /var&am…...

全栈架构设计图

以下是针对Vue前端、服务端、管理后台及数据库的架构图和交互流程设计&#xff0c;采用分层结构和模块化设计思路&#xff1a; 一、系统整体架构图 #mermaid-svg-vAtZ3R6d5Ujm6lYT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}…...

【SAP ME 42】SAP ME 性能改进

性能问题症状 可观察到以下症状:com.sap.me.production$SfcStartService#startSfc - 此 API 方法具有来自 RESOURCE_TYPE_RESOURCE 表的 SQL 查询的运行速度较慢。 com.sap.me.production$CreateSfcService#createSfc - 对于每个创建的车间作业控制,检查在计划标准配置中是否…...

《GPT-4.1深度解析:AI进化新标杆,如何重塑行业未来?》

一、GPT-4.1:AI 领域的 “全能战士” 降临 1.1 发布背景与战略意义 在 OpenAI 的技术迭代版图中,GPT-4.1 被赋予了 “承前启后” 的关键角色。它不仅是 GPT-4o 的全面升级版,更被视为向 GPT-5 过渡的重要桥梁。2025 年 4 月 15 日的发布会上,OpenAI 宣布 GPT-4.1 系列模型…...

node.js 基础

模块导入和导出 形式1 function get_jenkins(){return "jenkins....." }function test_cc(){return "4444444" }export {get_jenkins,test_cc}// 主函数 import { get_jenkins, test_cc } from ./module.js;console.log(get_jenkins()); console.log(tes…...

数据结构中的宝藏秘籍之广义表

广义表&#xff0c;也被称作列表&#xff08;Lists&#xff09;&#xff0c;是一种递归的数据结构。它就像一个神秘的盒子&#xff0c;既可以装着单个元素&#xff08;原子&#xff09;&#xff0c;也可以嵌套着其他的盒子&#xff08;子列表&#xff09;。比如广义表 (a (b c)…...

电流模式控制学习

电流模式控制 电流模式控制&#xff08;CMC&#xff09;是开关电源中广泛使用的一种控制策略&#xff0c;其核心思想是通过内环电流反馈和外环电压反馈共同调节占空比。相比电压模式控制&#xff0c;CMC具有更快的动态响应和更好的稳定性&#xff0c;但也存在一些固有缺点。 …...

汽车免拆诊断案例 | 2011款雪铁龙世嘉车刮水器偶尔自动工作

故障现象 一辆2011款雪铁龙世嘉车&#xff0c;搭载1.6 L 发动机&#xff0c;累计行驶里程约为19.8万km。车主反映&#xff0c;该车刮水器偶尔会自动工作&#xff0c;且前照灯偶尔会自动点亮。 故障诊断 接车后试车发现&#xff0c;除了上述故障现象以外&#xff0c;当用遥控器…...

#去除知乎中“盐选”付费故事

添加油猴脚本&#xff0c;去除知乎中“盐选”付费故事 // UserScript // name 盐选内容隐藏脚本 // namespace http://tampermonkey.net/ // version 0.2 // description 自动隐藏含有“盐选专栏”或“盐选”文字的回答卡片 // author YourName // mat…...

github 项目迁移到 gitee

1. 查看远程仓库地址 git remote -v 2. 修改远程仓库地址 确保 origin 指向你的 Gitee 仓库&#xff0c;如果不是&#xff0c;修改远程地址。 git remote set-url origin https://gitee.com/***/project.git 3. 查看本地分支 git branch 4. 推送所有本地分支 git p…...

2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(五级)答案 + 解析

青少年软件编程(Python)等级考试试卷(五级) 分数:100 题数:38 一、单选题(共25题,共50分) 1. 以下哪个选项不是Python中的推导式?( ) A. 列表推导式 B. 字典推导式 C. 集合推导式 D. 元组推导式 正确答案:D 答案解析:Python中的推导式包括列表推导式、字典推导式…...

[Unity]-[UI]-[Prefab] 关于UGUI UI Prefab的制作技巧

从上到下&#xff0c;从外到里&#xff0c;多用空物体套壳 这个意思就是说在使用ugui时制作prefab时&#xff0c;要遵循“从上到下&#xff0c;从外到里&#xff0c;多用空物体套壳”的原则&#xff0c;好处就是后面好修改&#xff0c;并且可以复用不同的prefab子模块。且在布…...

【Reading Notes】(8.3)Favorite Articles from 2025 March

【March】 雷军一度登顶中国首富&#xff0c;太厉害了&#xff08;2025年03月02日&#xff09; 早盘&#xff0c;小米港股一路高歌猛进&#xff0c;暴涨4%&#xff0c;股价直接飙到52港元的历史新高。这一波猛如虎的操作&#xff0c;直接把雷军的身家拉到了2980亿元&#xff0c…...

2021-11-09 C++倍数11各位和为13

缘由c函数题找数字的-编程语言-CSDN问答 void 倍数11各位和为13(int n, int& b, int* h) {//缘由https://ask.csdn.net/questions/7559803?spm1005.2025.3001.5141b !(n % 11);while(n)*h n % 10, n / 10; }int a 1, b 1, c 0, d 0;while (a < 100){倍数11各位和…...

2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(六级)真题

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;六级&#xff09; 分数&#xff1a;100 题数&#xff1a;38 答案解析&#xff1a;https://blog.csdn.net/qq_33897084/article/details/147341458 一、单选题(共25题&#xff0c;共50分) 1. 在tkinter的…...

Linux简介

一、Linux 简介 Linux 内核最初只是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的。 Linux 是一套免费使用和自由传播的类 Unix 操作系统&#xff0c;是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CP…...