c++日志输出库 spdlog 简介(3)多线程控制台输出日志
spdlog源码分析:https://www.cnblogs.com/eskylin/p/6483199.html
spdlog的异步模式使得spdLog可以支持多线程,于是写了一个多线程的小例子:
1、新建一个MFC工程。拖入两个按钮。

2、添加线程函数
在MFCApplication1Dlg.h中添加线程函数(Thread 1 和 Thread 2)的声明:
public:
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton2();
static UINT Thread1(LPVOID pParam);
static UINT Thread2(LPVOID pParam);
在CPP文件中添加函数代码:
void CMFCApplication1Dlg::OnBnClickedButton1()
{
AfxBeginThread(Thread1, this);
}
void CMFCApplication1Dlg::OnBnClickedButton2()
{
AfxBeginThread(Thread2, this);
}
UINT CMFCApplication1Dlg::Thread1(LPVOID pParam)
{
auto console = spd::stdout_color_mt("console1");
try{
for (int i = ; i < ; i++){
Sleep();
console->info("Thread 1,Count {}",i);
}
}
catch (const spd::spdlog_ex& ex)
{
std::cout << "Thread 1 Logger failed: " << ex.what() << std::endl;
}
spdlog::drop("console1");
return ;
}
UINT CMFCApplication1Dlg::Thread2(LPVOID pParam)
{
auto console = spd::stdout_color_mt("console2");
try{
for (int i = ; i < ; i++){
Sleep();
console->info("Thread 2,Count {}", i);
}
}
catch (const spd::spdlog_ex& ex)
{
std::cout << "Thread 2 Logger failed: " << ex.what() << std::endl;
}
spdlog::drop("console2");
return ;
}
在OnInitDialog()函数中添加开启控制台的代码:
// TODO: Add extra initialization here
AllocConsole();
freopen("CONOUT$", "w+t", stdout);
依次点击结果如下:

3、解析:
点击两个按钮时,会触发输出log的子线程,同时在控制台窗口中输出log信息。
需要注意的是,两个按钮中创建的logger均为控制台logger,但是名称不能相同,否则会发生重定义的错误。
auto console = spd::stdout_color_mt("console1");
auto console = spd::stdout_color_mt("console2");
mt和st,同步和异步模式的区别??
如上述代码所示:多线程在控制台输出日志时没有问题,如果多个线程同时向同一个txt文件中写入log呢?
c++日志输出库 spdlog 简介(3)多线程控制台输出日志的更多相关文章
- c++ 日志输出库 spdlog 简介(1)
参考文章: log库spdlog简介及使用 - 网络资源是无限的 - CSDN博客 http://blog.csdn.net/fengbingchun/article/details/78347105 ...
- c++ 日志输出库 spdlog 简介(2)
继续上一篇,example.cpp解析. 1.set_pattern 自定义日志格式 官方参考:https://github.com/gabime/spdlog/wiki/3.-Custom-form ...
- c++ 日志输出库 spdlog 简介(4)- 多线程txt输出日志
在上一节的代码中加入了向文本文件中写入日志的代码: UINT CMFCApplication1Dlg::Thread1(LPVOID pParam) { try{ size_t q_size = ; ...
- 日志输出最不重要的就是控制台输出,控制台输出就是system.out而已
1.日志输出最不重要的就是控制台输出,控制台输出就是system.out而已 2.所以日志输出时候会存在一个Bug就是:stdout要配置在日志输出的最前面,因为stdout控制台输出,最不重要,如果 ...
- C#在控制台输出异常所在的行数
对于异常,我们经常用try-catch语句来处理,一种常见的方式是在catch语句块用MessageBox.Show("异常")这种弹窗的方式来报告异常.但是有些时候,有些异常发生 ...
- 细说Java主流日志工具库
概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...
- 基于java.util.logging实现轻量级日志记录库(增加根据当前类class初始化,修复线程池模型(javaEE)下的堆栈轨迹顺序与当前调用方法不一致问题)
前言: 本章介绍自己写的基于java.util.logging的轻量级日志记录库(baseLog). 该版本的日志记录库犹如其名,baseLog,是个实现日志记录基本功能的小库,适合小型项目使用,方便 ...
- zlog 纯C日志函数库的简单使用方法
zlog简述: log是一个高性能.线程安全.灵活.概念清晰的纯C日志函数库. 事实上,在C的世界里面没有特别好的日志函数库(就像JAVA里面的的log4j,或者C++的log4cxx).C程序员都喜 ...
- Java主流日志工具库
在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息.在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子.我们先来逐一了解一下主流日志工具. 1.java.util.lo ...
随机推荐
- eclipse搭建struts2环境及所遇到的问题
最近几天一直在搭建struts2框架,本身struts2框架的搭建是非常简单的,但不知道为什么最近就是总是报错,报了一大串的错 首先就是每次在类的根路径下创建struts.xml时,就报错,也不知道为 ...
- 创建第一个Maven项目
-----------------------siwuxie095 创建第一个 Maven 项目 1.打开 Ec ...
- 8-导弹拦截一(n^2 and nlogn)
/*某国为了防御敌国的导弹袭击,研发出一套导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发拦截炮弹能够到达任意的高度,但是以后每一发拦截炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的多 ...
- Boolean.getBoolean用法
相信很多人被Boolean.getBoolean(String name)欺骗过,想当然的认为它是将"true"或者"false"转换为Boolean类型的AP ...
- 那些我离不开的 Sketch 插件
当谈论到插件时,我是一名极客.各种新颖的 Sketch 插件层出不穷,但是有那么几个是我怎么也离不开的. Sketch 运行器 多层的插件菜单再也不会影响我的效率了. 我推迟了好几年才使用这个插件,因 ...
- FTP 搭建
FTP 搭建 FTP 是 File Transfer Protocol(文件传输协议)的英文简称,它工作在 0SI 模型的第七层,TCP 模型的第四屋上,即应用层. 一.FTP 简介 FTP 会话时包 ...
- 函数数组demo
#include <stdio.h> #include <string.h> typedef int(*service_func)(char *,char *); struct ...
- Linux操作系统Vim代码Tab自动补全配置
function! CleverTab() , col( ) =~ '^\s*$' return "\<Tab>" else return "\<C-N ...
- Activiti中23张表的含义
1.与流程定义相关的4张表: 2.与执行任务相关的5张表: 3.与流程变量相关的2张表
- 2018.09.02 Atcoder Regular Contest 102简要题解
比赛传送门 T1 Triangular Relationship 分析之后发现有两种情况: 1. n为奇数,那么所有数都是k的倍数. 2. n为偶数,那么所有数都是k/2的倍数. 然后就可以愉快A题了 ...