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

地税局内网网站建设深圳印刷网站建设

地税局内网网站建设,深圳印刷网站建设,百度搜索收录提交入口,如何搭建游戏平台C 自定义简单的异步日志类 背景:在项目中由于将写日志功能放到了主线程中,导致主线程执行某个功能时会造成界面的卡顿。在调试程序过程中,发现是频繁的同步写日志操作导致界面卡顿。在把同步写日志函数注释后,函数执行不再卡顿,功…

C++ 自定义简单的异步日志类

背景:在项目中由于将写日志功能放到了主线程中,导致主线程执行某个功能时会造成界面的卡顿。在调试程序过程中,发现是频繁的同步写日志操作导致界面卡顿。在把同步写日志函数注释后,函数执行不再卡顿,功能也正常。但是该功能没有写入日志信息了。这样操作就不能更好的排查问题了。所以就采用异步写日志的方法。

自定义异步日志类:

.h文件

#pragma once
#include<afx.h>
#include<afxmt.h>
#include<afxwin.h>
#include<windows.h>
#include<deque>
#include<string>
#include<fstream>
using namespace std;
class CAsyncLog
{
public:static CAsyncLog& Instance();void Log(const CString& strLog);void Stop();private:CAsyncLog();~CAsyncLog();static UINT WriteLogThread(LPVOID lpvoid);void SwapBuffers();void WriteToFile(deque<string>& buffer);bool m_bRuning;CWinThread* m_pThread;// 前端缓冲区deque<string> m_frontBuffer;// 后端缓冲区deque<string> m_backBuffer;// 临界区,实现线程同步CCriticalSection m_cs;// 输出文件ofstream m_file;
};

.cpp文件

#include <time.h>
CAsyncLog& CAsyncLog::Instance()
{static CAsyncLog m_asyncLog;return m_asyncLog;
}CAsyncLog::CAsyncLog()
{TCHAR szPath[MAX_PATH];::GetModuleFileName(NULL,szPath,MAX_PATH);CString strFile(szPath);strFile = strFile.Left(strFile.ReverseFind('\\')+ 1);strFile += _T("app.log");m_bRuning = true;m_file.open(strFile.GetBuffer(),ios::app);strFile.ReleaseBuffer();m_pThread = AfxBeginThread(WriteLogThread,this);
}CAsyncLog::~CAsyncLog()
{Stop();
}UINT CAsyncLog::WriteLogThread(LPVOID lpvoid)
{CAsyncLog* pAsyncLog = (CAsyncLog*)lpvoid;while (pAsyncLog->m_bRuning){// 每100ms查询一次::Sleep(100);pAsyncLog->SwapBuffers();}// 线程退出前写入剩余的日志信息pAsyncLog->SwapBuffers();return 0;
}void CAsyncLog::Log(const CString& strText)
{CSingleLock lock(&m_cs,TRUE);CTime tm = CTime::GetCurrentTime();CString strTime = tm.Format(_T("[%Y-%m-%d %H:%M:%S] "));// 转换为streamCStringA strBuffer(strTime + strText);string strLog = static_cast<const char*>(strBuffer);m_frontBuffer.push_back(strLog);
}void CAsyncLog::Stop()
{m_bRuning = false;if (m_pThread){::WaitForSingleObject(m_pThread->m_hThread,5000);m_pThread = nullptr;}if (m_file.is_open()){m_file.close();}
}void CAsyncLog::WriteToFile(deque<string>& buffer)
{deque<string>::const_iterator it = buffer.begin();for (;it != buffer.end();it++){m_file << *it << "\r\n";}m_file.flush();
}void CAsyncLog::SwapBuffers()
{CSingleLock lock(&m_cs,TRUE);if (m_frontBuffer.empty())return;m_frontBuffer.swap(m_backBuffer);WriteToFile(m_backBuffer);m_backBuffer.clear();
}

该类的使用方式是:

#include <iostream>
#include"AsyncLog.h"int main()
{for (int i=0;i<10;i++){CString str;str.Format(_T("AsyncLog Test,%d"),i);CAsyncLog::Instance().Log(str);}std::cout << "Hello World!\n";
}

说明:日志生成再当前软件的运行目录下。

http://www.dtcms.com/a/470775.html

相关文章:

  • 【Typora——MD编辑器】Typora最新 V1.12.1版:轻量级 Markdown 编辑器详细图文下载安装使用教程
  • SAM-SAM2-SAM3系列(一):Segment Anything Model(SAM)技术详解与实战
  • 利用DeepSeek辅助生成股市行情模拟数据测试电子表格插件rusty_sheet 0.2多表读取功能
  • 包头建站东莞手机微信网站
  • 珠海手机网站建设广州建设网站公司
  • 网站综合查询工具建筑工程网教
  • 医院网站需要前置审批苏州网站网络营销推广
  • 个人AI环境快速搭建
  • RAG优化实战:业务场景驱动的 Embedding 模型量化评估
  • 房地产活动策划网站电脑网站转换手机网站怎么做
  • 犀牛云网站建设怎么样做网站的心得体会
  • pc网站还有必要做吗泰安企业网站建设电话
  • 有了网站域名如何做网站多国语言网站
  • TCP中的拥塞控制
  • IP到IP间通讯
  • C 语言运算符优先级
  • dedecms网站地图前台路径不修改wordpress大学教程课件
  • 沈阳网站建设选网龙网页的网站建设在哪里
  • 科技未来网站建设哪些网站可以做电脑画画赚钱
  • 免费网站建设教程视频常州建设公司网站
  • 网站页面设计要求网站制作方案解决办法
  • GTSA中的 gtsam::StereoPoint2 类注释解读
  • 网上商城网站建设规划网站版式分类
  • 网站备案知识网页设计发展前景分析
  • 战地6正式上线发售!手机平板怎么玩战地6
  • Google 智能体设计模式:防护栏/安全模式
  • 1.Modbus读取寄存器转换为Double C#例子 WPF例子
  • 厦门网站建设培训微信网站建设流程图
  • 网站的目标定位有哪些怎样做国际网站
  • 记录一次上网b站和百度网络卡顿的情况,大约是因为1.1.1.1 dns解析的问题