90 lines
2.2 KiB
C++
90 lines
2.2 KiB
C++
#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
|