#pragma once #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 Останавливает обработку сообщений. * * После остановки очереди новые сообщения не принимаются. * Рабочий поток завершится после обработки всех сообщений, * которые уже находились в очереди. */ void stop(); private: /** * @brief Основной цикл рабочего потока. */ void process(); private: /** * @brief Логгер для записи сообщений. * * Используется только рабочим потоком. */ logger::Logger &logger_; /** * @brief Очередь входящих сообщений. */ MessageQueue &queue_; /** * @brief Поток записи. */ std::thread workerThread_; }; } // namespace app