feat(app): add logger worker thread for asynchronous message processing
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
#include <atomic>
|
||||
#include <thread>
|
||||
|
||||
#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<bool> running_{false};
|
||||
};
|
||||
|
||||
} // namespace app
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user