MFC 分段记录时间log类

news/2024/12/2 18:38:16/

在开发大型自动化系统或者多线程应用时,日志记录和时间追踪通常是系统调试和性能优化的关键部分。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/news/1551816.html

相关文章

Oracle--表空间Tablespace

在 Oracle 数据库中&#xff0c;表空间&#xff08;Tablespace&#xff09; 是一种逻辑存储结构&#xff0c;用于组织和管理数据库中物理存储数据文件的方式。以下是表空间相关操作的详细介绍&#xff0c;包括创建、修改、删除、查询以及常见问题处理。 1. 表空间的作用 提供逻…

MySQL 数据库学习教程一:开启数据库探索之旅

在当今数字化时代&#xff0c;数据已然成为企业和组织最为宝贵的资产之一。而数据库管理系统则是存储、管理和操作这些数据的核心工具。MySQL 作为一款广泛应用的开源关系型数据库管理系统&#xff0c;以其可靠性、高性能和易用性而备受青睐。如果你渴望踏入数据库领域&#xf…

七、传统循环神经网络(RNN)

传统循环神经网络 RNN 前言一、RNN 是什么&#xff1f;1.1 RNN 的结构1.2 结构举例 二、RNN 模型的分类2.1 按照 输入跟输出 的结构分类2.2 按照 内部结构 分类 三、传统 RNN 模型3.1 RNN内部结构图3.2 内部计算公式3.3 其中 tanh 激活函数的作用3.4 传统RNN优缺点 四、代码演示…

MATLAB中exportgraphics函数用法

目录 语法 说明 示例 将坐标区导出为图像文件 指定图像分辨率 导出图窗 导出为仅包含向量图的 PDF 导出多页 PDF 导出动画 GIF 导出分块图布局 将热图导出为具有透明背景的 PDF 创建用于保存绘图的 App exportgraphics函数的功能是将绘图或图形内容保存到文件。 语…

网络设备配置指南:交换机、路由器与防火墙的基础配置与管理

在现代网络管理中,交换机、路由器和防火墙是不可或缺的关键设备。掌握这些设备的基本配置与管理,对于确保网络的稳定性、安全性和高效性至关重要。本文将详细介绍交换机、路由器和防火墙的基础配置与管理,并通过代码示例和图示来帮助读者更好地理解和应用。 一、交换机的基…

【新能源汽车电驱动系统测试设备】核心厂商主要包括Team Technik、AVL List、清研凌创、Horiba和ThyssenKrupp等

摘要 根据 HengCe&#xff08;恒策咨询&#xff09;的统计及预测&#xff0c;2023年全球新能源汽车电驱动系统测试设备市场销售额达到了3.8亿美元&#xff0c;预计2030年将达到6.6亿美元&#xff0c;年复合增长率&#xff08;CAGR&#xff09;为7.5%&#xff08;2024-2030&…

net9 abp vnext 多语言通过数据库动态管理

通过数据库加载实现动态管理&#xff0c;用户可以自己修改界面显示的文本&#xff0c;满足国际化需求 如图所示,前端使用tdesign vnext 新建表TSYS_Localization与TSYS_LocalizationDetail 国旗图标下载网址flag-icons: Free Country Flags in SVG 在Shared下创建下图3个文件 …

Network Link Conditioner Mac 上模拟网络环境工具的安装和使用

前言 Xcode 的模拟器本身是不支持模拟网络环境的&#xff0c;在开发界面的时候&#xff0c;设计会出无网、弱网这种情况的设计图&#xff0c;为了方便在开发过程中实现这些情况的代码逻辑&#xff0c;Network Link Conditioner 就是模拟网络环境的好帮手。 安装 Network Lin…