#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 引數
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 延遲及間隔時間
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毫秒後執行)
bool AsyncOnce(callable&& fun, arguments&&... args) {
return Start(1, task, false);
非同步迴圈執行任務
bool AsyncLoop(int msTime, callable&& fun, arguments&&... args) {
return Start(msTime, task, true);
private:
int m_nCount = 0; //迴圈次數
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;
};
#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:
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;
};