定時器?
#ifndef CTimer_hpp
#define CTimer_hpp
#include <stdio.h>
#include <functional>
#include <chrono>
#include <thread>
#include <atomic>
#include <mutex>
#include <string>
#include <condition_variable>
class CTimer
{
public:
CTimer(const std::string sTimerName = ""); //構造定時器,附帶名稱
~CTimer();
/**
開始運行定時器
@param msTime 延遲運行(單位ms)
@param task 任務函數接口
@param bLoop 是否循環(默認執行1次)
@param async 是否異步(默認異步)
@return true:已準備執行,否則失敗
*/
bool Start(unsigned int msTime, std::function<void()> task, bool bLoop = false, bool async = true);
/**
取消定時器,同步定時器無法取消(若任務代碼已執行則取消無效)
*/
void Cancel();
/**
同步執行一次
#這個接口感覺作用不大,暫時現實在這里
@param msTime 延遲時間(ms)
@param fun 函數接口或lambda代碼塊
@param args 參數
@return true:已準備執行,否則失敗
*/
template<typename callable, typename... arguments>
bool SyncOnce(int msTime, callable&& fun, arguments&&... args) {
std::function<typename std::result_of<callable(arguments...)>::type()> task(std::bind(std::forward<callable>(fun), std::forward<arguments>(args)...)); //綁定任務函數或lambda成function
return Start(msTime, task, false, false);
}
/**
異步執行一次任務
@param msTime 延遲及間隔時間
@param fun 函數接口或lambda代碼塊
@param args 參數
@return true:已準備執行,否則失敗
*/
template<typename callable, typename... arguments>
bool AsyncOnce(int msTime, callable&& fun, arguments&&... args) {
std::function<typename std::result_of<callable(arguments...)>::type()> task(std::bind(std::forward<callable>(fun), std::forward<arguments>(args)...));
return Start(msTime, task, false);
}
/**
異步執行一次任務(默認延遲1毫秒后執行)
@param fun 函數接口或lambda代碼塊
@param args 參數
@return true:已準備執行,否則失敗
*/
template<typename callable, typename... arguments>
bool AsyncOnce(callable&& fun, arguments&&... args) {
std::function<typename std::result_of<callable(arguments...)>::type()> task(std::bind(std::forward<callable>(fun), std::forward<arguments>(args)...));
return Start(1, task, false);
}
/**
異步循環執行任務
@param msTime 延遲及間隔時間
@param fun 函數接口或lambda代碼塊
@param args 參數
@return true:已準備執行,否則失敗
*/
template<typename callable, typename... arguments>
bool AsyncLoop(int msTime, callable&& fun, arguments&&... args) {
std::function<typename std::result_of<callable(arguments...)>::type()> task(std::bind(std::forward<callable>(fun), std::forward<arguments>(args)...));
return Start(msTime, task, true);
}
private:
void DeleteThread(); //刪除任務線程
public:
int m_nCount = 0; //循環次數
private:
std::string m_sName; //定時器名稱
std::atomic_bool m_bExpired; //裝載的任務是否已經過期
std::atomic_bool m_bTryExpired; //裝備讓已裝載的任務過期(標記)
std::atomic_bool m_bLoop; //是否循環
std::thread *m_Thread = nullptr;
std::mutex m_ThreadLock;
std::condition_variable_any m_ThreadCon;
};