59 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| // Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
 | |
| // Distributed under the MIT License (http://opensource.org/licenses/MIT)
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| // periodic worker thread - periodically executes the given callback function.
 | |
| //
 | |
| // RAII over the owned thread:
 | |
| //    creates the thread on construction.
 | |
| //    stops and joins the thread on destruction (if the thread is executing a callback, wait for it
 | |
| //    to finish first).
 | |
| 
 | |
| #include <chrono>
 | |
| #include <condition_variable>
 | |
| #include <functional>
 | |
| #include <mutex>
 | |
| #include <thread>
 | |
| namespace spdlog {
 | |
| namespace details {
 | |
| 
 | |
| class SPDLOG_API periodic_worker {
 | |
| public:
 | |
|     template <typename Rep, typename Period>
 | |
|     periodic_worker(const std::function<void()> &callback_fun,
 | |
|                     std::chrono::duration<Rep, Period> interval) {
 | |
|         active_ = (interval > std::chrono::duration<Rep, Period>::zero());
 | |
|         if (!active_) {
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         worker_thread_ = std::thread([this, callback_fun, interval]() {
 | |
|             for (;;) {
 | |
|                 std::unique_lock<std::mutex> lock(this->mutex_);
 | |
|                 if (this->cv_.wait_for(lock, interval, [this] { return !this->active_; })) {
 | |
|                     return;  // active_ == false, so exit this thread
 | |
|                 }
 | |
|                 callback_fun();
 | |
|             }
 | |
|         });
 | |
|     }
 | |
|     std::thread &get_thread() { return worker_thread_; }
 | |
|     periodic_worker(const periodic_worker &) = delete;
 | |
|     periodic_worker &operator=(const periodic_worker &) = delete;
 | |
|     // stop the worker thread and join it
 | |
|     ~periodic_worker();
 | |
| 
 | |
| private:
 | |
|     bool active_;
 | |
|     std::thread worker_thread_;
 | |
|     std::mutex mutex_;
 | |
|     std::condition_variable cv_;
 | |
| };
 | |
| }  // namespace details
 | |
| }  // namespace spdlog
 | |
| 
 | |
| #ifdef SPDLOG_HEADER_ONLY
 | |
|     #include "periodic_worker-inl.h"
 | |
| #endif
 |