Files
cpp17-threaded-app-non-thre…/app/include/logger_worker.hpp
T

90 lines
2.2 KiB
C++
Raw Normal View History

2026-07-20 23:25:35 +04:00
#pragma once
#include <atomic>
#include <thread>
#include "logger.hpp"
#include "message_queue.hpp"
namespace app {
/**
* @brief Фоновый поток записи сообщений в журнал.
*
* LoggerWorker получает сообщения из MessageQueue и передаёт их
* в библиотеку Logger для записи в файл.
*
* Объект Logger используется только внутри рабочего потока,
* поэтому потокобезопасность Logger не требуется.
*/
class LoggerWorker {
public:
/**
* @brief Создаёт worker для записи сообщений.
*
* @param logger Логгер, используемый для записи.
* @param queue Очередь сообщений.
*/
LoggerWorker(logger::Logger &logger, MessageQueue &queue);
/**
* @brief Останавливает поток записи.
*
* Дожидается завершения рабочего потока.
*/
~LoggerWorker();
/**
* @brief Запрещает копирование worker.
*/
LoggerWorker(const LoggerWorker &) = delete;
/**
* @brief Запрещает копирующее присваивание.
*/
LoggerWorker &operator=(const LoggerWorker &) = delete;
/**
* @brief Запускает поток записи сообщений.
*/
void start();
/**
* @brief Отправляет сигнал завершения потоку записи.
*
* После обработки всех сообщений worker завершит работу.
*/
void stop();
private:
/**
* @brief Основной цикл рабочего потока.
*/
void process();
private:
/**
* @brief Логгер для записи сообщений.
*
* Используется только рабочим потоком.
*/
logger::Logger &logger_;
/**
* @brief Очередь входящих сообщений.
*/
MessageQueue &queue_;
/**
* @brief Поток записи.
*/
std::thread workerThread_;
/**
* @brief Флаг работы потока.
*/
std::atomic<bool> running_{false};
};
} // namespace app