diff --git a/app/include/logger_worker.hpp b/app/include/logger_worker.hpp index d29c6aa..3280e84 100644 --- a/app/include/logger_worker.hpp +++ b/app/include/logger_worker.hpp @@ -1,6 +1,5 @@ #pragma once -#include #include #include "logger.hpp" @@ -30,7 +29,8 @@ public: /** * @brief Останавливает поток записи. * - * Дожидается завершения рабочего потока. + * Останавливает очередь сообщений и дожидается завершения + * рабочего потока после обработки оставшихся сообщений. */ ~LoggerWorker(); @@ -50,9 +50,11 @@ public: void start(); /** - * @brief Отправляет сигнал завершения потоку записи. + * @brief Останавливает обработку сообщений. * - * После обработки всех сообщений worker завершит работу. + * После остановки очереди новые сообщения не принимаются. + * Рабочий поток завершится после обработки всех сообщений, + * которые уже находились в очереди. */ void stop(); @@ -79,11 +81,6 @@ private: * @brief Поток записи. */ std::thread workerThread_; - - /** - * @brief Флаг работы потока. - */ - std::atomic running_{false}; }; } // namespace app diff --git a/app/src/logger_worker.cpp b/app/src/logger_worker.cpp new file mode 100644 index 0000000..7c6c9d5 --- /dev/null +++ b/app/src/logger_worker.cpp @@ -0,0 +1,28 @@ +#include "logger_worker.hpp" + +namespace app { + +LoggerWorker::LoggerWorker(logger::Logger &logger, MessageQueue &queue) + : logger_(logger), queue_(queue) {} + +LoggerWorker::~LoggerWorker() { stop(); } + +void LoggerWorker::start() { + workerThread_ = std::thread(&LoggerWorker::process, this); +} + +void LoggerWorker::stop() { + queue_.stop(); + + if (workerThread_.joinable()) { + workerThread_.join(); + } +} + +void LoggerWorker::process() { + while (auto message = queue_.pop()) { + logger_.writeMessage(message->level, message->message); + } +} + +} // namespace app