2026-07-20 23:25:35 +04:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <thread>
|
|
|
|
|
|
|
|
|
|
#include "logger.hpp"
|
|
|
|
|
#include "message_queue.hpp"
|
|
|
|
|
|
|
|
|
|
namespace app {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Фоновый поток записи сообщений в журнал.
|
|
|
|
|
*
|
|
|
|
|
* LoggerWorker получает сообщения из MessageQueue и передаёт их
|
|
|
|
|
* в библиотеку Logger для записи в файл.
|
|
|
|
|
*
|
2026-07-21 15:24:00 +04:00
|
|
|
* Logger передаётся в worker по значению и перемещается внутрь объекта.
|
|
|
|
|
* LoggerWorker становится владельцем логгера.
|
|
|
|
|
*
|
2026-07-20 23:25:35 +04:00
|
|
|
* Объект Logger используется только внутри рабочего потока,
|
|
|
|
|
* поэтому потокобезопасность Logger не требуется.
|
|
|
|
|
*/
|
|
|
|
|
class LoggerWorker {
|
|
|
|
|
public:
|
|
|
|
|
/**
|
|
|
|
|
* @brief Создаёт worker для записи сообщений.
|
|
|
|
|
*
|
2026-07-21 15:24:00 +04:00
|
|
|
* Переданный Logger перемещается внутрь объекта LoggerWorker.
|
|
|
|
|
*
|
2026-07-20 23:25:35 +04:00
|
|
|
* @param logger Логгер, используемый для записи.
|
|
|
|
|
* @param queue Очередь сообщений.
|
|
|
|
|
*/
|
2026-07-21 15:24:00 +04:00
|
|
|
LoggerWorker(logger::Logger logger, MessageQueue &queue);
|
2026-07-20 23:25:35 +04:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Останавливает поток записи.
|
|
|
|
|
*
|
2026-07-21 12:48:53 +04:00
|
|
|
* Останавливает очередь сообщений и дожидается завершения
|
|
|
|
|
* рабочего потока после обработки оставшихся сообщений.
|
2026-07-20 23:25:35 +04:00
|
|
|
*/
|
|
|
|
|
~LoggerWorker();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Запрещает копирование worker.
|
|
|
|
|
*/
|
|
|
|
|
LoggerWorker(const LoggerWorker &) = delete;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Запрещает копирующее присваивание.
|
|
|
|
|
*/
|
|
|
|
|
LoggerWorker &operator=(const LoggerWorker &) = delete;
|
|
|
|
|
|
2026-07-21 15:24:00 +04:00
|
|
|
/**
|
|
|
|
|
* @brief Разрешает перемещение worker.
|
|
|
|
|
*
|
|
|
|
|
* Передаёт владение потоком записи и состоянием объекта.
|
|
|
|
|
*/
|
|
|
|
|
LoggerWorker(LoggerWorker &&) noexcept = default;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Разрешает перемещающее присваивание worker.
|
|
|
|
|
*/
|
|
|
|
|
LoggerWorker &operator=(LoggerWorker &&) noexcept = default;
|
|
|
|
|
|
2026-07-20 23:25:35 +04:00
|
|
|
/**
|
|
|
|
|
* @brief Запускает поток записи сообщений.
|
|
|
|
|
*/
|
|
|
|
|
void start();
|
|
|
|
|
|
2026-07-21 15:24:00 +04:00
|
|
|
/**
|
|
|
|
|
* @brief Возвращает используемый логгер.
|
|
|
|
|
*
|
|
|
|
|
* Позволяет получить текущую конфигурацию логгера,
|
|
|
|
|
* например имя файла журнала или уровень логирования
|
|
|
|
|
* по умолчанию.
|
|
|
|
|
*
|
|
|
|
|
* @return Константная ссылка на логгер.
|
|
|
|
|
*/
|
|
|
|
|
[[nodiscard]]
|
|
|
|
|
const logger::Logger &getLogger() const;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Устанавливает новый логгер.
|
|
|
|
|
*
|
|
|
|
|
* Новый Logger заменяет текущий.
|
|
|
|
|
* Переданный объект перемещается внутрь worker.
|
|
|
|
|
*
|
|
|
|
|
* @param logger Новый логгер.
|
|
|
|
|
*/
|
|
|
|
|
void setLogger(logger::Logger logger);
|
|
|
|
|
|
2026-07-20 23:25:35 +04:00
|
|
|
/**
|
2026-07-21 12:48:53 +04:00
|
|
|
* @brief Останавливает обработку сообщений.
|
2026-07-20 23:25:35 +04:00
|
|
|
*
|
2026-07-21 12:48:53 +04:00
|
|
|
* После остановки очереди новые сообщения не принимаются.
|
|
|
|
|
* Рабочий поток завершится после обработки всех сообщений,
|
|
|
|
|
* которые уже находились в очереди.
|
2026-07-20 23:25:35 +04:00
|
|
|
*/
|
|
|
|
|
void stop();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
/**
|
|
|
|
|
* @brief Основной цикл рабочего потока.
|
|
|
|
|
*/
|
|
|
|
|
void process();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
/**
|
|
|
|
|
* @brief Логгер для записи сообщений.
|
|
|
|
|
*
|
|
|
|
|
* Используется только рабочим потоком.
|
|
|
|
|
*/
|
2026-07-21 15:24:00 +04:00
|
|
|
logger::Logger logger_;
|
2026-07-20 23:25:35 +04:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Очередь входящих сообщений.
|
|
|
|
|
*/
|
|
|
|
|
MessageQueue &queue_;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Поток записи.
|
|
|
|
|
*/
|
|
|
|
|
std::thread workerThread_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace app
|