c++日志输出库 spdlog 简介(3)多线程控制台输出日志

spdlog源码分析:https://www.cnblogs.com/eskylin/p/6483199.html

spdlog的异步模式使得spdLog可以支持多线程,于是写了一个多线程的小例子:

1、新建一个MFC工程。拖入两个按钮。

image

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 = 0; i < 10; i++){
            Sleep(500); 
            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 0;
}
UINT CMFCApplication1Dlg::Thread2(LPVOID pParam)
{
    auto console = spd::stdout_color_mt("console2");
    try{
        for (int i = 0; i < 10; i++){
            Sleep(500);
            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 0;
}

在OnInitDialog()函数中添加开启控制台的代码:

// TODO: Add extra initialization here
    AllocConsole();
    freopen("CONOUT$", "w+t", stdout);

依次点击结果如下:

image

3、解析:

点击两个按钮时,会触发输出log的子线程,同时在控制台窗口中输出log信息。

需要注意的是,两个按钮中创建的logger均为控制台logger,但是名称不能相同,否则会发生重定义的错误。

auto console = spd::stdout_color_mt("console1");
auto console = spd::stdout_color_mt("console2");

mt和st,同步和异步模式的区别??

如上述代码所示:多线程在控制台输出日志时没有问题,如果多个线程同时向同一个txt文件中写入log呢?

转载于:https://www.cnblogs.com/oucsheep/p/8466969.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值