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

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

接上一讲三、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的例子

    相关文章:

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

    接上一讲三、2、2>4》&#xff0c;创建logger.h和helper_t.h里的gettime函数 即解决下图的报红 同时&#xff0c;接上一讲二、3、点击“确认”按钮后&#xff0c;进入MainFrame.h对应的下述界面&#xff0c;此讲下图进行实现 一、创建Logger.h&#xff1a;日志记录文件&…...

    CesiumInstancedMesh 实例

    CesiumInstancedMesh 实例 import * as Cesium from cesium;// Three.js 风格的 InstancedMesh 类, https://threejs.org/docs/#api/en/objects/InstancedMesh export class CesiumInstancedMesh {/*** Creates an instance of InstancedMesh.** param {Cesium.Geometry} geom…...

    单细胞注释前沿: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 ) …...

    日语学习-日语知识点小记-构建基础-JLPT-N4阶段(30):みます

    日语学习-日语知识点小记-构建基础-JLPT-N4阶段(30):みます 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)ように 復習:1、ように Change12、ように Ideal state(理想(りそう)の状態(じょうたい))3、V辞書・Vない ようにしています いつも気をつけて…...

    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…...

    Go语言通道如何实现通信

    在Go语言中&#xff0c;通道&#xff08;channel&#xff09;是一种内置的数据结构&#xff0c;用于在不同的goroutine之间进行通信和同步。通道提供了一种安全且有效的方式来传递数据&#xff0c;避免了数据竞争和死锁等问题。 要在Go语言中使用通道进行通信&#xff0c;你需…...

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

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

    题目 3316: 蓝桥杯2025年第十六届省赛真题-数组翻转

    题目 3316: 蓝桥杯2025年第十六届省赛真题-数组翻转 时间限制: 3s 内存限制: 512MB 提交: 101 解决: 24 题目描述 小明生成了一个长度为 n 的正整数数组 a1, a2, . . . , an&#xff0c;他可以选择连续的一 段数 al , al1, ..., ar&#xff0c;如果其中所有数都相等即 al al1 …...

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

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

    Netty 实战篇:为自研 RPC 框架加入异步调用与 Future 支持

    我们在上篇实现了一个轻量级 RPC 框架&#xff0c;现在要进一步优化 —— 加入异步响应支持&#xff0c;让 RPC 通信变得真正高效、非阻塞、支持并发。 一、为什么需要异步调用&#xff1f; 上篇的 RPC 框架是“同步阻塞”的&#xff1a; 每次发送请求后&#xff0c;必须等待服…...

    python37天打卡

    知识点回顾&#xff1a; 过拟合的判断&#xff1a;测试集和训练集同步打印指标 模型的保存和加载 仅保存权重 保存权重和模型 保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 作业&#xff1a;对信贷数据集训练后保存权重&#xff0c;加载权重后继续训练50轮&am…...

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

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

    嵌入式硬件篇---Ne555定时器

    文章目录 前言1. 基本概述类型功能封装形式2. 引脚功能(DIP-8 封装)内部结构阈值电压两种工作模式4. 主要特性优点:缺点:5. 典型应用场景定时控制脉冲生成检测与触发信号处理6. 关键参数速查表前言 本文简单介绍了Ne555定时器(多谐振荡器/定时器)。DIP与SOP封装。 1. 基…...

    【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…...

    Datatable和实体集合互转

    1.使用已废弃的 JavaScriptSerializer&#xff0c;且反序列化为弱类型 ArrayList。可用但不推荐。 using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Web; using Sy…...

    Win11切换JDK版本批处理脚本

    维护的老项目jdk1.8&#xff0c;新项目开发采用jdk21&#xff0c;所以寻找类似nvm的软件&#xff0c;都不太满意&#xff0c;最后还是决定采用写一个脚本算了&#xff0c;先不折腾了。 1、创建switch_jdk.bat文件 2、把如下内容复制进行 echo off chcp 65001 >nul setloc…...

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

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

    对数的运算困惑

    难点总结 学生在对数运算中的难点分析: 一、不理解对数,不会用对数公式或错用对数公式 ①对数 l o g 2 3 log_23 log2​3和指数幂 2 3 2^3 23一样,也就是个实数而已,所以其也会有加减乘除乘方开方等运算; 比如 2 2 + l o g 2 3 = 2 2 ⋅ 2 l o g 2 3 = 4 ⋅ 3 = 12 2^{2…...

    C++ 图像处理库 CxImage 简介 (迁移至OpenCV)

    文章目录 核心功能特点局限性与替代方案常用方法构造函数从数组创建图像访问属性访问像素点Windows平台支持 常用方法迁移至OpenCV CxImage 是一款功能强大的图像处理类库&#xff0c;主要用于 Windows 平台的图像处理任务。它支持多种图像格式的加载、保存、编辑及特效处理&am…...