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呢?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM