Init public repo
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
#include "../../Saver/ISaver.h"
|
||||
|
||||
class ISaveThread
|
||||
{
|
||||
public:
|
||||
virtual ~ISaveThread() = default;
|
||||
|
||||
virtual void save(const std::string& msg, ISaver::ImportanceMessage importance) = 0;
|
||||
};
|
||||
@@ -0,0 +1,46 @@
|
||||
#include "SaveThread.h"
|
||||
|
||||
#include <chrono>
|
||||
#include <iostream>
|
||||
|
||||
SaveThread::SaveThread(SaverLib& saver) : saver_(saver)
|
||||
{
|
||||
is_runing_.store(true);
|
||||
save_thread_ = std::make_unique<std::thread>([this] { SaveThreadMethod(); });
|
||||
}
|
||||
|
||||
void SaveThread::SaveThreadMethod()
|
||||
{
|
||||
// поток может завершится только если не будет сообщений в очереди, иначе он сначала все сохранит
|
||||
while(is_runing_.load() || queue_.empty() == false)
|
||||
{
|
||||
// Небольшая задержка для разгрузки CPU
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||
|
||||
std::scoped_lock lock(m_queue_);
|
||||
if (queue_.empty())
|
||||
continue;
|
||||
|
||||
Msg msg = queue_.front();
|
||||
try {
|
||||
saver_->save(msg.msg, msg.importance);
|
||||
queue_.pop_front();
|
||||
} catch (const std::exception& e) {
|
||||
std::cerr << e.what() << '\n';
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SaveThread::~SaveThread()
|
||||
{
|
||||
is_runing_.store(false);
|
||||
save_thread_->join();
|
||||
}
|
||||
|
||||
void SaveThread::save(const std::string& msg, ISaver::ImportanceMessage importance)
|
||||
{
|
||||
std::scoped_lock lock(m_queue_);
|
||||
queue_.push_back(Msg {msg, importance});
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
|
||||
#include "ISaveThread.h"
|
||||
#include "../SaverLib.h"
|
||||
|
||||
#include <thread>
|
||||
#include <atomic>
|
||||
#include <mutex>
|
||||
#include <list>
|
||||
#include <memory>
|
||||
|
||||
class SaveThread : public ISaveThread
|
||||
{
|
||||
struct Msg
|
||||
{
|
||||
std::string msg;
|
||||
ISaver::ImportanceMessage importance;
|
||||
};
|
||||
SaverLib& saver_;
|
||||
|
||||
std::list<Msg> queue_;
|
||||
std::mutex m_queue_;
|
||||
|
||||
/*
|
||||
* Поток сохранения логов
|
||||
*/
|
||||
std::unique_ptr<std::thread> save_thread_;
|
||||
void SaveThreadMethod();
|
||||
std::atomic_bool is_runing_;
|
||||
public:
|
||||
SaveThread(SaverLib& saver);
|
||||
~SaveThread();
|
||||
|
||||
void save(const std::string& msg, ISaver::ImportanceMessage importance) override;
|
||||
};
|
||||
Reference in New Issue
Block a user