#pragma once #include #include #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 running_{false}; }; } // namespace app