首頁>Club>
5
回覆列表
  • 1 # 使用者834195712159

    #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;

    };

  • 中秋節和大豐收的關聯?
  • 白衣服發黃怎麼洗白?