OPC Client第6讲(wxwidgets):Logger.h日志记录文件(单例模式);登录后的主界面

news2025/6/6 18:37:31

接上一讲三、2、2>4》,创建logger.h和helper_t.h里的gettime函数

  • 即解决下图的报红

同时,接上一讲二、3、点击“确认”按钮后,进入MainFrame.h对应的下述界面,此讲下图进行实现

一、创建Logger.h:日志记录文件,用于在指定路径下创建日志文件,提供方法写入日志信息

1、在helper_t.h中创建gettime函数

注意,师傅的helper_t.h是SDK库里的,不是自己写的 

2、创建Logger.h

1>创建单例模式

1》单例模式:保证一个类只有一个实例,并提供一个全局访问点

《1》“实例”通常指的是某个类的具体对象。当你创建一个类的对象时,这个对象就是一个“实例”。

  • 实例是指某个类的具体对象,它是数据结构和方法的集合。

.NET6 WebApi第3讲:控制反转(IOC)和依赖注入(DI)、依赖倒置、服务(如何使用?三种生命周期)、typeof()、Autofac(增强IOC容器)_net6 ioc-CSDN博客

《2》为什么返回引用?——保证唯一性(单例的关键)

返回引用是为了确保单例唯一性、避免拷贝开销【见2》】

《3》代码

2》这个全局的唯一访问点在MainFrame.h中

《1》extern的用途:声明一个变量或函数(.h),并指示该变量或函数实际定义在另一个文件中(对应的.cpp)

《2》代码

在头文件(MainFrame.h)里声明(加上extern),源文件(MainFrame.cpp)中定义(这是全局的唯一访问点)

  • 声明:头文件中的 extern 声明告诉其他源文件(包括实现文件本身)存在这样一个变量,但并不为其分配空间。
    • 你可以在多个文件中包含这个声明,而不会引起冲突。
  • 定义:源文件中的定义则提供了具体的变量实现,分配了所需的内存,并完成了初始化。
    • 每个变量只能有一个定义,否则会导致链接错误(重复定义)。

1)为什么要加 extern ?:让变量可以在多个其它源文件(.cpp)中被访问,但只在一个地方实际定义,避免重复定义错误

    • 其它.cpp文件只需要#include<UaApp/MainFrame.h>,便可以直接使用logger变量了
    • 如果不加extern,那么
      • 每个包含 MainFrame.h 的 .cpp 文件都会生成一个 logger 变量的定义。
      • 链接时就会报错:重复定义错误

    2)为什么logger变量 要 使用引用?

    因为1》中的GetInstance()函数返回值是Logger&引用。

    • 返回引用是为了确保单例唯一性、避免拷贝开销

    3》C++引用作为函数返回值

    《1》基本语法

    注意:只返回静态变量、外部变量或传递给函数的对象成员的引用

    • 如果函数返回的是局部变量的引用,则该引用指向的内容会在函数退出时被销毁,因此会导致悬空引用的问题

    《2》c++引用作为函数返回值的三个作用:

    《3》const在*前后的不同意义:根据“靠近原则”,const关键字更靠近哪一部分,就表示那一部分是常量

    • 如果const位于*的左边(如const int *ptrint const *ptr),则表示指向的内容是常量(指向常量的指针)。
      • 这意味着你不能通过该指针修改所指向的数据,但你可以改变指针本身指向哪个地址。
    • 如果const位于*的右边(如int* const ptr),则表示指针自身是常量(指针常量)。
      • 这表示指针本身的地址是固定的,即指针一旦初始化后,就不能再指向其他地址。但是,如果指针指向的对象不是常量的话,它的值仍然可以通过其他方式修改。

    2>Logger构造函数:设置日期决定当天的日志写入哪个文件,检查并创建日志文件目录(文件名加上当天日期)

    1》GetCurrentDate函数:获取当前时间

    strftime(string format time):标准 C 库函数,用于将时间信息格式化为自定义的字符串表示形式

    2》CreateDirectory函数:创建并检查目录

    对于 Windows 平台,应该包含 <direct.h> 头文件来使用 _mkdir 函数。

    而在 POSIX 系统(如 Linux 和 macOS)上,则应包含 <sys/stat.h><sys/types.h> 来使用 mkdir 函数。

    3》Logger构造函数完整代码

    3>Log函数

    由于2、的Logger类是1>单例模式,所以Logger构造函数只会在代码运行后执行一次。所以日志记录主要功能都在这个Log函数中。

    Log函数的功能:按照日期决定当天的日志写入哪个文件(要防止多个线程同时写入同一个文件,因为在代码多处需要日志记录的地方可能都会调用Log函数)

    1》防止多个线程同时写入同一个文件

    std::lock_guard<std::mutex> lock(mutex_);这一行会在进入作用域时自动对mutex_加锁,并且在离开作用域(即函数结束或出现异常退出时)自动解锁。

    2》Log函数完整代码

    3、调用1、2、【先看2、1>2》】

    二、登录后的主界面

    1、需要先学习CMake,运行SDK的例子

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

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

    相关文章

    单细胞注释前沿:CASSIA——无参考、可解释、自动化细胞注释的大语言模型

    细胞类型注释是单细胞RNA-seq分析的重要步骤&#xff0c;目前有许多注释方法。大多数注释方法都需要计算和特定领域专业知识的结合&#xff0c;而且经常产生不一致的结果&#xff0c;难以解释。大语言模型有可能在减少人工输入和提高准确性的同时扩大可访问性&#xff0c;但现有…

    历年武汉大学计算机保研上机真题

    2025武汉大学计算机保研上机真题 2024武汉大学计算机保研上机真题 2023武汉大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school 分段函数计算 题目描述 写程序计算如下分段函数&#xff1a; 当 x > 0 x > 0 x>0 时&#xff0c; f ( x ) …

    AR-HUD 光波导方案优化难题待解?OAS 光学软件来破局

    波导-HUD系统案例分析 简介 光波导技术凭借其平板超薄结构和强大的二维扩展能力&#xff0c;在解决AR-HUD问题方面展现出显著优势。一方面&#xff0c;其独特的结构特性能够大幅减小对光机体积的需求&#xff0c;成为 HUD 未来发展的重要技术方向&#xff1b;另一方面&#xf…

    火狐安装自动录制表单教程——仙盟自动化运营大衍灵机——仙盟创梦IDE

    打开火狐插件页面 安装完成 使用 功能 录制浏览器操作 录入地址 开始操作 录制完成 在当今快速发展的软件开发生态中&#xff0c;自动化测试已从一种新兴技术手段&#xff0c;转变为保障软件质量与开发效率不可或缺的关键环节。其重要性体现在多个维度&#xff0c;同时&#x…

    线程池的详细知识(含有工厂模式)

    前言 下午学习了线程池的知识。重点探究了ThreadPoolExecutor里面的各种参数的含义。我详细了解了这部分的知识。其中有一个参数涉及工厂模式&#xff0c;我将这一部分知识分享给大家~ 线程池的详细介绍(含工厂模式) 结语 分享到此结束啦。byebye~

    木愚科技闪亮第63届高博会 全栈式智能教育解决方案助力教学升级

    5月23日&#xff0c;第63届高等教育博览会在长春东北亚国际博览中心开幕&#xff0c;木愚科技积极筹备&#xff0c;奔赴展会现场。彼时&#xff0c;木愚科技企业领导及相关职能部门负责人亲临展位指导工作&#xff0c;通过特装展位、资料发放及现场交流等方式&#xff0c;全方位…

    Proteus寻找元器件(常见)

    一 元件库 二 找元件 1 主控 32 51 输入 stm32 AT89c51 2 找屏幕 oled 3 找按键button 4 电阻、电容 res cap 5 电机驱动 l298n 6 电机 motor 7 滑动变阻器 pot 8 找电源和 GND 9 找晶振 选择 D 开头的 CRYSTAL 10 网络标签

    RK3566 Android12 HG24C02MM/TR EEPROM适配

    一、背景 近期项目中&#xff0c;有一个需求&#xff0c;要使用RK3566 Android12平台适配一款HG24C02MM/TR EEPROM芯片&#xff0c;通过i2c实现主板与EEPROM芯片的数据通讯。废话不多说&#xff0c;来看资料。 二、芯片资料 HG24C02 / HG24C04 / HG24C08 / HG24C16是提供2048…

    IoTDB 集成 DBeaver,简易操作实现时序数据清晰管理

    数据结构一目了然&#xff0c;跨库分析轻松实现&#xff0c;方便 IoTDB “内部构造”管理&#xff01; 随着物联网场景对时序数据处理需求激增&#xff0c;时序数据库与数据库管理工具的集成尤为关键。作为数据资产的 “智能管家”&#xff0c;借助数据库管理工具的可视化操作界…

    sqli-labs第二十八关——Trick with ‘union select‘

    一&#xff1a;分析 这一关的提示和上一关一样&#xff0c;所以我们查看源码&#xff0c;屏蔽了注释符&#xff0c;空格&#xff0c;union&#xff0c;select等关键词 分析这一条源码的几个新增添符号 \s&#xff1a; 匹配任何的空白字符&#xff08;普通空格&#xff0c;\t&…

    mapbox高阶,PMTiles介绍,MBTiles、PMTiles对比,加载PMTiles文件

    👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️Fill面图层样式1.4 ☘️PMTiles介绍1.5…

    投稿 IEEE Transactions on Knowledge and Data Engineering 注意事项

    投稿 IEEE Transactions on Knowledge and Data Engineering 注意事项 要IEEE overleaf 模板私信,我直接给我自己论文,便于编辑 已经投稿完成了,有一些小坑 准备工作 注册IEEE账户:若没有IEEE账户,需前往IEEE官网注册。注册成功后,可用于登录投稿系统。现在新的系统,…

    mongodb源码分析session接受客户端find命令过程

    mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制。 现在继续研究ASIOSession和connection是怎么接受客户端命令的&#xff1f; mongo/transport/service_state_machine.cpp核心方法有&#xf…

    变焦位移计:机器视觉如何克服人工疲劳与主观影响?精准对结构安全实时监测

    变焦视觉位移监测与人工监测的对比 人工监测是依靠目测检查或借助于全站仪&#xff0c;水准仪&#xff0c;RTK等便携式仪器测量得到的信息&#xff0c;但是随着整个行业的发展&#xff0c;传统的人工监测方法已经不能满足监测需求&#xff0c;从人工监测到自动化监测已是必然趋…

    【Axure结合Echarts绘制图表】

    1.绘制一个矩形&#xff0c;用于之后存放图表&#xff0c;将其命名为test&#xff1a; 2.新建交互 -> 载入时 -> 打开链接&#xff1a; 3.链接到URL或文件路径&#xff1a; 4.点击fx&#xff1a; 5.输入&#xff1a; javascript: var script document.createEleme…

    使用web3工具结合fiscobcos网络部署调用智能合约

    借助 web3 工具&#xff0c;在 FISCO BCOS 网络上高效部署与调用智能合约&#xff0c;解锁区块链开发新体验。 搭建的区块链网络需要是最新的fiscobcos3.0&#xff0c;最新的才支持web3调用 现在分享踩坑经验&#xff0c;希望大家点赞 目录 1.搭建fiscobcos节点&#xff08;3.…

    Oracle/openGauss中,DATE/TIMESTAMP与数字日期/字符日期比较

    ORACLE 运行环境 openGauss 运行环境 0、前置知识 ORACLE&#xff1a;DUMP()函数用于返回指定表达式的数据类型、字节长度及内部存储表示的详细信息 SELECT DUMP(123) FROM DUAL; -- Typ2 Len3: 194,2,24 SELECT DUMP(123) FROM DUAL;-- Typ96 Len3: 49,50,51 -- ASCII值&am…

    爬虫学习-Scrape Center spa6 超简单 JS 逆向

    关卡 spa6 电影数据网站&#xff0c;无反爬&#xff0c;数据通过 Ajax 加载&#xff0c;数据接口参数加密且有时间限制&#xff0c;适合动态页面渲染爬取或 JavaScript 逆向分析。 首先抓包发现get请求的参数token有加密。 offset表示翻页&#xff0c;limit表示每一页有多少…

    尚硅谷redis7 86 redis集群分片之3主3从集群搭建

    86 redis集群分片之3主集群搭建 3主3从redis集群配置 找3台真实虚拟机,各自新建 mķdir -p /myredis/cluster 新建6个独立的redis实例服务 IP:192.168.111.175端口6381/端口6382 vim /myredis/cluster/redisCluster6381.conf bind 0.0.0.0 daemonize yes protected-mode no …

    【解决办法】Git报错error: src refspec main does not match any.

    在命令行中使用 Git 进行 git push -u origin main 操作时遇到报错error: src refspec main does not match any。另一个错误信息是&#xff1a;error: failed to push some refs to https://github.com/xxx/xxx.git.这是在一个新设备操作时遇到的问题&#xff0c;之前没有注意…