MFC 分段记录时间log类

server/2024/11/30 9:15:20/

在开发大型自动化系统或者多线程应用时,日志记录和时间追踪通常是系统调试和性能优化的关键部分。CAuxiliary 类是一个封装了文件日志记录和高精度计时功能的实用工具类,旨在为开发人员提供一种简便的方式,来实现系统运行的日志记录和时间性能分析。本文将详细介绍如何使用 CAuxiliary 类来记录日志和进行高精度的时间测量。

头文件

#pragma once
#include <chrono>     // std::chronoclass CAuxiliary
{
public:CAuxiliary() : mIsRecord(false) {}~CAuxiliary() { CloseFile(); }// 设置是否记录日志bool CreateAndOpenFile(CString fileName, bool IsRecord);void CloseFile();void AppendContent(CString content);// 插入开始时间,当bFirstBegin为true时表示首次开始void StartTime(bool bFirstBegin = false);// 插入结束时间,当bAllEnd为true时表示全部结束,这是将会记录总时间void EndTime(CString content, bool bAllEnd = false);private:CStdioFile m_sf;bool mIsRecord;// 用于高精度计时std::chrono::high_resolution_clock::time_point m_start;std::chrono::high_resolution_clock::time_point m_firstBegin;std::chrono::high_resolution_clock::time_point m_end;std::chrono::high_resolution_clock::time_point m_mediu;
};

源文件

#include "stdafx.h"  // 适用于 MFC 项目,包含标准的 MFC 头文件
#include <iostream>
#include <chrono>     // std::chrono
#include <fstream>
#include"CAuxiliary.h"
using namespace std;bool CAuxiliary::CreateAndOpenFile(CString fileName, bool IsRecord)
{mIsRecord = IsRecord;if (!mIsRecord) { return true; }// 如果文件已经打开,先关闭它if (m_sf.m_hFile != CFile::hFileNull) {CloseFile();}// 尝试打开文件if (m_sf.Open(fileName, CFile::modeCreate | CFile::modeWrite)) {return true;}return false;
}void CAuxiliary::CloseFile()
{if (!mIsRecord) { return; }if (m_sf.m_hFile != CFile::hFileNull) {m_sf.Close();}
}void CAuxiliary::AppendContent(CString content)
{if (!mIsRecord) { return; }if (m_sf.m_hFile == CFile::hFileNull) { return; }// 计算当前时间差(以毫秒为单位)auto now = std::chrono::high_resolution_clock::now();std::chrono::duration<int64_t, std::milli> duration = std::chrono::duration_cast<std::chrono::duration<int64_t, std::milli>>(now - m_mediu);m_mediu = now;// 获取当前时间(时:分:秒:毫秒)SYSTEMTIME st;GetLocalTime(&st);  // 获取本地时间// 格式化时间戳int ms = static_cast<int>(duration.count());  // 转换为毫秒CString timeStamp;timeStamp.Format(_T("%02d:%02d:%02d:%03d\t%dms\t%s\n"),st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, ms, content);m_sf.SeekToEnd();m_sf.WriteString(timeStamp);
}void CAuxiliary::StartTime(bool bFirstBegin)
{if (!mIsRecord) { return; }m_start = std::chrono::high_resolution_clock::now();m_mediu = m_start;if (bFirstBegin) {m_firstBegin = m_start;}
}void CAuxiliary::EndTime(CString content, bool bAllEnd)
{if (!mIsRecord) { return; }if (m_sf.m_hFile == CFile::hFileNull) { return; }m_end = std::chrono::high_resolution_clock::now();// 计算时间差(以毫秒为单位)std::chrono::duration<int64_t, std::milli> duration = bAllEnd ? std::chrono::duration_cast<std::chrono::duration<int64_t, std::milli>>(m_end - m_firstBegin): std::chrono::duration_cast<std::chrono::duration<int64_t, std::milli>>(m_end - m_start);int ms = static_cast<int>(duration.count());  // 转换为毫秒CString result;result.Format(_T("%s:\t%dms\n"), content, ms);m_sf.SeekToEnd();m_sf.WriteString(result);
}

类的设计与功能

CAuxiliary 类设计上非常简洁,主要实现了以下功能:

  1. 日志记录: 该类可以创建一个日志文件,并在文件中附加内容。
  2. 高精度计时: 使用 std::chrono 提供的高精度计时器来记录时间,适合记录程序的执行时间。
  3. 开始和结束时间记录: 通过设置开始时间和结束时间,可以计算程序执行的时长,支持记录部分执行时间和总体执行时间。

类的成员函数解析

1. CreateAndOpenFile

bool CAuxiliary::CreateAndOpenFile(CString fileName, bool IsRecord)

此函数用于创建并打开日志文件。如果 IsRecordtrue,它将打开指定路径的日志文件。如果文件已存在,则会先关闭再重新打开文件。否则,如果 IsRecordfalse,该函数将直接返回 true,而不执行文件操作。

使用示例:

CAuxiliary aux;
aux.CreateAndOpenFile(_T("log.txt"), true);
2. CloseFile

void CAuxiliary::CloseFile()

该函数用于关闭打开的日志文件。当不再需要记录日志时,可以调用此函数释放资源。文件会在不再记录日志时被关闭。

使用示例:

aux.CloseFile();
3. AppendContent

void CAuxiliary::AppendContent(CString content)

此函数用于向日志文件中追加内容。它会在内容前加上当前时间戳(包括小时、分钟、秒和毫秒)以及从上次调用 AppendContent 以来的时间差(以毫秒为单位)。如果没有开启记录日志功能,函数不会执行任何操作。

使用示例:

aux.AppendContent(_T("Processing step 1"));
4. StartTime

void CAuxiliary::StartTime(bool bFirstBegin)

此函数用于记录操作的开始时间。如果 bFirstBegintrue,则会记录首次开始时间。此时间点将作为后续计算时间差的基准。

使用示例:

aux.StartTime(true);
5. EndTime

void CAuxiliary::EndTime(CString content, bool bAllEnd)

此函数用于记录操作的结束时间并计算与开始时间的差值。它支持两种模式:

  • 部分结束模式(默认):计算从 StartTimeEndTime 的时间差。
  • 全部结束模式:计算从首次开始时间(即 StartTime(true))到当前结束时间的时间差。这个功能对于记录整个任务的总耗时非常有用。

使用示例:

aux.EndTime(_T("Processing step 1 finished"));

 

示例代码

下面是一个完整的示例,展示了如何使用 CAuxiliary 类来记录日志并进行时间测量:

#include "CAuxiliary.h"
#include <thread>int main() {CAuxiliary aux;// 创建并打开日志文件if (aux.CreateAndOpenFile(_T("process_log.txt"), true)) {// 开始时间记录aux.StartTime(true);std::this_thread::sleep_for(std::chrono::seconds(1));  // 模拟延迟//阶段一aux.StartTime();aux.AppendContent(_T("Start processing step 1"));// 模拟处理步骤std::this_thread::sleep_for(std::chrono::seconds(1));  // 模拟延迟aux.EndTime(_T("Processing step 1 finished"));	// 阶段一结束时间记录//阶段二aux.StartTime();aux.AppendContent(_T("Start processing step 2"));	// 模拟处理步骤std::this_thread::sleep_for(std::chrono::seconds(1));  // 模拟延迟aux.EndTime(_T("Processing step 2 finished"));// 阶段二结束时间记录aux.EndTime(_T("Process finished"),true);//总的时间aux.CloseFile();	// 关闭文件}return 0;}


http://www.ppmy.cn/server/146130.html

相关文章

podman 源码 5.3.1编译

1. 构建环境 在麒麟V10服务器操作系统上构建&#xff1a;Kylin-Server-V10-GFB-Release-2204-Build03-ARM64.iso。由于只是编译 podman 源码&#xff0c;没必要特地在物理机或服务上安装一个这样的操作系统&#xff0c;故采用在虚拟机里验证。 2. 安装依赖 参考资料&#xf…

【论文笔记】Tool Learning with Foundation Models 论文笔记

Tool Learning with Foundation Models 论文笔记 文章目录 Tool Learning with Foundation Models 论文笔记摘要背景&#xff1a;工作&#xff1a; 引言工具学习的发展本文工作&#xff08;大纲&目录&#xff09; 背景2.1 工具使用的认知起源2.2 工具分类&#xff1a;用户界…

数据结构 (18)数的定义与基本术语

前言 数据结构是计算机科学中的一个核心概念&#xff0c;它描述了数据元素之间的关系以及这些元素在计算机中的存储方式。 一、数的定义 在计算机科学中&#xff0c;“数”通常指的是树形数据结构&#xff0c;它是一种非线性的数据结构&#xff0c;由节点&#xff08;或称为元素…

水泥厂可视化技术推动工业智造新变革

通过图扑可视化技术&#xff0c;水泥厂实现生产流程的实时监控与优化管理&#xff0c;提高生产效率&#xff0c;减少能耗。这一技术革新使得工厂运行更加智能化&#xff0c;为行业现代化发展注入新动力。

51单片机从入门到精通:理论与实践指南常用资源篇(五)

坚持一下&#xff0c;确实还有几天就可以学完了&#xff0c;这段时间的努力和付出都将化为宝贵的成果。正如《人民日报》所说&#xff1a;“每一次努力&#xff0c;都是幸运的伏笔。” 不论是在学习、工作还是生活中&#xff0c;坚持都是通往成功的必经之路。当我们在面对困难和…

2024年陕西科技大学数据结构程序填空题+预测

递归实现插入排序 #include <stdio.h>void insertion_sort(int arr[], int n) {if (n > 1){insertion_sort(arr, n - 1);arr[0] arr[n];int i;for (i n - 1; i > 0; i--){if (arr[i] > arr[0]){arr[i 1] arr[i];}else{break;}}arr[i 1] arr[0];} }int m…

.net XSSFWorkbook 读取/写入 指定单元格的内容

方法如下&#xff1a; using NPOI.SS.Formula.Functions;using NPOI.SS.UserModel;using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;using OfficeOpenXml.FormulaParsing.Excel.Functions.Numeric;/// <summary>/// 读取Excel指定单元格内容/// </summa…

【Linux相关】服务器无网情况配置conda

【Linux相关】 服务器无网情况配置conda 文章目录 环境配置1. 本地下载miniconda&#xff0c;传到服务器2. 确认安装包是否传送成功3. 确保有安装权限4. 安装5. 写路径6. 看一下是否成功 环境配置 ssh的话&#xff0c;服务器连不上网&#xff0c;无法在线下载&#xff0c;需要本…