feat(app): add logger worker thread for asynchronous message processing
This commit is contained in:
@@ -1,6 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <atomic>
|
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
#include "logger.hpp"
|
#include "logger.hpp"
|
||||||
@@ -30,7 +29,8 @@ public:
|
|||||||
/**
|
/**
|
||||||
* @brief Останавливает поток записи.
|
* @brief Останавливает поток записи.
|
||||||
*
|
*
|
||||||
* Дожидается завершения рабочего потока.
|
* Останавливает очередь сообщений и дожидается завершения
|
||||||
|
* рабочего потока после обработки оставшихся сообщений.
|
||||||
*/
|
*/
|
||||||
~LoggerWorker();
|
~LoggerWorker();
|
||||||
|
|
||||||
@@ -50,9 +50,11 @@ public:
|
|||||||
void start();
|
void start();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Отправляет сигнал завершения потоку записи.
|
* @brief Останавливает обработку сообщений.
|
||||||
*
|
*
|
||||||
* После обработки всех сообщений worker завершит работу.
|
* После остановки очереди новые сообщения не принимаются.
|
||||||
|
* Рабочий поток завершится после обработки всех сообщений,
|
||||||
|
* которые уже находились в очереди.
|
||||||
*/
|
*/
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
@@ -79,11 +81,6 @@ private:
|
|||||||
* @brief Поток записи.
|
* @brief Поток записи.
|
||||||
*/
|
*/
|
||||||
std::thread workerThread_;
|
std::thread workerThread_;
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Флаг работы потока.
|
|
||||||
*/
|
|
||||||
std::atomic<bool> running_{false};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace app
|
} // 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