zoukankan      html  css  js  c++  java
  • 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呢?

  • 相关阅读:
    kafka-python基本使用
    RabbitMq 消息队列详解
    Socket 编程
    python 进程, 线程 ,协程,锁,协程应用到爬虫的讲解
    python中with的用法
    为什么 Elasticsearch 需要堆内存来存储数据
    面向数据的架构
    跟我一起学Redis之看完这篇比常人多会三种类型实战(又搞了几个小时)
    跟我一起学.NetCore之熟悉的接口权限验证不能少(Jwt)
    跟我一起学.NetCore之WebApi接口裸奔有风险(Jwt)
  • 原文地址:https://www.cnblogs.com/oucsheep/p/8466969.html
Copyright © 2011-2022 走看看