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

article/2025/9/7 10:30:36

接上一讲三、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.hkcw.cn/article/ygOnKHUOEC.shtml

    相关文章

    mkdir: cannot create directory ‘gitlab-stu’: No space left on device

    Linux中创建目录时报错“mkdir: cannot create directory ‘gitlab-stu’: No space left on device”&#xff0c;磁盘空间不足。 使用df命令查看&#xff0c;发现 / 下面use%占满了&#xff1a; 查看inode使用情况&#xff1a; 可以看到docker的数据大部分存放在/var/lib/do…

    st倍增(st表)

    ST表不仅能处理区间最值问题&#xff0c;凡是符合结合律且可重复贡献的信息查询都可以使用ST表高效进行。可重复贡献的意义在于&#xff0c;可以对两个交集不为空的区间进行信息合并&#xff0c;显然最大值、最小值、最大公约数、最小公倍数、按位或、按位与都符合这个条件。 在…

    Minimax-speech-hd

    paper 文章目录 abstractMethod abstract speech_encoder 提取音色信息&#xff0c;不需要prompt text&#xff08;更加适用于跨语言任务&#xff0c;解耦了prompt 文本和prompt style/timbre)Flow-VAE 提升合成音质&#xff1b; Method speaker encoder: 相比于其他预训练…

    python高级3——元类与动态类创建

    元类 1、元类(Metaclass)的概念 元类是Python中一个高级概念&#xff0c;本质上是**“类的类”**&#xff0c;用于控制创建类的过程。元类是创建类的模板在Python中&#xff1a; 类定义了实例的行为元类定义了类的行为 2、python中的默认元类 在Python中&#xff0c;type是…

    SpringBoot整合RocketMQ--实例

    原文网址&#xff1a;SpringBoot整合RocketMQ--实例-CSDN博客 简介 本文介绍SpringBoot整合RocketMQ的方法。 spring-boot-starter-parent版本&#xff1a;2.4.13RocketMQ版本&#xff1a;4.9.4。&#xff08;写这篇文章时&#xff0c;5.X版本的Java客户端还没完善&#xff…

    9.5 Q1 | 北京协和医学院GBD发文 | 1990-2021 年全球、区域和国家心力衰竭负担及其根本原因

    1.第一段-文章基本信息 文章题目&#xff1a;Global, regional, and national burden of heart failure and its underlying causes, 1990-2021: results from the global burden of disease study 2021 中文标题&#xff1a;1990-2021 年全球、区域和国家心力衰竭负担及其根本…

    汇聚全球智慧,共话艺术设计与现代化教育——ADME 2025

    会议简介 第二届艺术设计与现代化教育国际会议&#xff08;ADEME 2025&#xff09;在风光旖旎的春城昆明隆重召开。这是一场集全球艺术设计精英与教育创新者于一体的学术盛宴。会议围绕“创意启迪教育革新”主题&#xff0c;旨在搭建一个多元文化交流与知识共享的平台&#xff…

    从 SWT Browser 迁移到 JxBrowser

    多年来&#xff0c;SWT 一直内置一个 Browser 组件。这是一个依赖于操作系统自带的 Web engine 的简单组件。该组件可以很好地显示网页并处理简单的任务&#xff0c;但对于需要跨平台行为一致、更好地控制 Engine、隔离用户数据等更高级需求来说&#xff0c;它显然不够用。 因…

    编译原理笔记 2025/4/22

    基本概念 汇编语言与高级程序设计语言的关系/汇编干嘛的&#xff1a;高级语言与硬件无关&#xff0c;汇编语言的定义与CPU的指令系统直接相关。只要将高级语言编写的程序等价地转换成特定硬件平台所支持的方式来实现&#xff08;汇编程序或机器指令序列&#xff09;&#xff0…

    (ICML-2025) RIFLEx:视频扩散Transformer中长度外推的“免费午餐”

    RIFLEx&#xff1a;视频扩散Transformer中长度外推的“免费午餐” paper title&#xff1a;RIFLEx: A Free Lunch for Length Extrapolation in Video Diffusion Transformers paper是THU发表在ICML 2025的工作 Code:链接 Abstract 近期视频生成的进展使模型能够合成高质量的分…

    树莓派超全系列教程文档--(52)如何启用VNC功能

    如何启用VNC功能 使用 VNC 共享屏幕启用 VNC 服务器以图形方式启用 VNC 服务器在命令行上启用 VNC 服务器 连接到 VNC 服务器 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 VNC 共享屏幕 有时&#xff0c;使用设备进行物理操作并不方便。…

    TDengine 运维——巡检工具(安装工具)

    背景 TDengine 的安装包自带安装脚本&#xff0c;但无法基于集群进行自动化安装部署&#xff0c;本文档旨在说明如何使用安装工具进行 TDengine 的集群式安装部署。 安装工具支持功能 安装方式详细说明单节点安装部署单节点环境安装部署 TDengine集群安装部署集群环境安装部…

    Qt Creator调用Python代码

    Qt Creator下调用Python代码 在Qt编写的上位机,现在可能经常用到Python相关的代码。本篇记录Qt Creator中调用Python的一种方法。 Python使用的版本为 3.9.10,(安装参考:Python3.9的安装和配置) Qt 使用的版本为5.14.2,(Qt的安装可以参考网上的安装案例:Qt 5.14安装…

    政策+技术双轮驱动:MiC建筑如何成为“好房子”建设的破局之道

    在建筑行业不断追求创新与可持续发展的今天&#xff0c;模块化集成建筑&#xff08;Modular Integrated Construction&#xff0c;简称MiC&#xff09;正逐渐崭露头角&#xff0c;成为推动行业转型升级的重要力量。近日&#xff0c;全国政协常委、人口资源环境委员会副主任&…

    Python Day37

    Task&#xff1a; 1.过拟合的判断&#xff1a;测试集和训练集同步打印指标 2.模型的保存和加载 a.仅保存权重 b.保存权重和模型 c.保存全部信息checkpoint&#xff0c;还包含训练状态 3.早停策略 1. 过拟合的判断&#xff1a;测试集和训练集同步打印指标 过拟合是指模型在训…

    2025年全国青少年信息素养大赛 scratch图形化编程挑战赛 小低组初赛 内部集训模拟题解析

    2025年信息素养大赛初赛scratch模拟题解析 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】 scratch资料 Scratch3.0系列视频课程资料零基础学习scratch3.0【入门教学 免费】零基础学习scratch3.0【视频教程 114节 免费】 历届蓝桥杯scratch国赛真题解析历届蓝桥杯scr…

    Linux环境基础开发工具->gcc/g++

    引入&#xff1a;gcc/g是什么&#xff1f; 在上篇博客我们知道&#xff0c;vim是一个编辑器&#xff0c;vim负责的是代码的编辑&#xff1b;而gcc/g是一个编译器&#xff0c;负责的就是代码的编译&#xff01;gcc负责C语言代码的编译&#xff0c;而g负责c代码的编译&#xff0…

    云原生与DevOps融合实践:加速企业数字化转型的加速器

    &#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;为什么“云原生DevOps”是当下最强组合&#xff1f; 在传统软件交付模式逐步被淘汰的当下&#xff0c;越来…

    孙颖莎王曼昱出战WTT美国站女双 拉斯维加斯再携手

    2025年WTT美国大满贯将于7月3日至13日在拉斯维加斯奥尔良体育馆及美高梅大酒店会议中心举行。孙颖莎和王曼昱将搭档出战女双正赛。在不久前结束的多哈世乒赛女单决赛中,孙颖莎以4比3的大比分险胜王曼昱,成功卫冕。责任编辑:zx0176

    基于51单片机和8X8点阵屏、独立按键的射击消除类小游戏

    目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、8X8点阵屏2、独立按键3、定时器04、定时器1 四、主函数总结 系列文章目录 前言 使用的是普中A2开发板。 【单片机】STC89C52RC 【频率】12T11.0592MHz 【外设】8X8点阵屏、独立按键 效果查看/操作演示&#x…