最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++11實現(xiàn)簡易定時器的示例代碼

 更新時間:2020年04月10日 08:25:44   作者:踏莎行hyx  
這篇文章主要介紹了C++11實現(xiàn)簡易定時器的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

定時器timer是多線程編程中經(jīng)常設計到的工具類

定時器的原理其實很簡單:

  • 創(chuàng)建一個新線程
  • 在那個線程里等待
  • 等待指定時長后做任務

這里用C++11實現(xiàn)了一個簡單易用的定時器,包含兩種模式:

  • 周期性定時任務執(zhí)行
  • 單次延時任務執(zhí)行

timer.hpp

#ifndef _TIMER_H_
#define _TIMER_H_

#include <functional>
#include <chrono>
#include <thread>
#include <atomic>
#include <memory>
#include <mutex>
#include <condition_variable>

class Timer
{
public:
 Timer(): _expired(true), _try_to_expire(false)
 {}

 Timer(const Timer& timer)
 {
 _expired = timer._expired.load();
 _try_to_expire = timer._try_to_expire.load();
 }

 ~Timer()
 {
 stop();
 }

 void start(int interval, std::function<void()> task)
 {
 // is started, do not start again
 if (_expired == false)
  return;

 // start async timer, launch thread and wait in that thread
 _expired = false;
 std::thread([this, interval, task]() {
  while (!_try_to_expire)
  {
  // sleep every interval and do the task again and again until times up
  std::this_thread::sleep_for(std::chrono::milliseconds(interval));
  task();
  }

  {
  // timer be stopped, update the condition variable expired and wake main thread
  std::lock_guard<std::mutex> locker(_mutex);
  _expired = true;
  _expired_cond.notify_one();
  }
 }).detach();
 }

 void startOnce(int delay, std::function<void()> task)
 {
 std::thread([delay, task]() {
  std::this_thread::sleep_for(std::chrono::milliseconds(delay));
  task();
 }).detach();
 }

 void stop()
 {
 // do not stop again
 if (_expired)
  return;

 if (_try_to_expire)
  return;

 // wait until timer 
 _try_to_expire = true; // change this bool value to make timer while loop stop
 {
  std::unique_lock<std::mutex> locker(_mutex);
  _expired_cond.wait(locker, [this] {return _expired == true; });

  // reset the timer
  if (_expired == true)
  _try_to_expire = false;
 }
 }

private:
 std::atomic<bool> _expired; // timer stopped status
 std::atomic<bool> _try_to_expire; // timer is in stop process
 std::mutex _mutex;
 std::condition_variable _expired_cond;
};

#endif // !_TIMER_H_

main.cpp

#include <iostream>
#include "timer.hpp"

void func1()
{
 std::cout << "trigger func1" << std::endl;
}

void func2(int x)
{
 std::cout << "trigger func2, x: " << x << std::endl;
}

int main(int argc, char* argv[])
{
 Timer timer;

 // execute task every timer interval
 std::cout << "--- start period timer ----" << std::endl;
 timer.start(1000, std::bind(func2, 3));
 std::this_thread::sleep_for(std::chrono::milliseconds(5000));
 timer.stop();
 std::cout << "--- stop period timer ----" << std::endl;

  // execute task once after delay
 std::cout << "--- start one shot timer ----" << std::endl;
 timer.startOnce(1000, func1);
 std::cout << "--- stop one shot timer ----" << std::endl;

 getchar();
 return 0;
}

運行結果

--- start period timer ----
trigger func2, x: 3
trigger func2, x: 3
trigger func2, x: 3
trigger func2, x: 3
trigger func2, x: 3
--- stop period timer ----
--- start one shot timer ----
--- stop one shot timer ----
trigger func1

到此這篇關于C++11實現(xiàn)簡易定時器的示例代碼的文章就介紹到這了,更多相關C++11 定時器 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++?OpenCV中幾種基本的圖像處理方式

    C++?OpenCV中幾種基本的圖像處理方式

    大家好,本篇文章主要講的是C++?OpenCV中幾種基本的圖像處理方式,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C++ Coroutine簡單學習教程

    C++ Coroutine簡單學習教程

    這篇文章主要為大家詳細介紹了C++ Coroutine的簡單學習教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 使用C語言實現(xiàn)本地socke通訊的方法

    使用C語言實現(xiàn)本地socke通訊的方法

    這篇文章主要介紹了?使用C語言實現(xiàn)本地socke通訊,代碼分為服務器代碼和客戶端代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • C#?CLR學習?C++使用namespace實例詳解

    C#?CLR學習?C++使用namespace實例詳解

    這篇文章主要為大家介紹了C#?CLR學習?C++使用namespace實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • C語言編程實例之輸出指定圖形問題

    C語言編程實例之輸出指定圖形問題

    這篇文章主要介紹了C語言編程實例之輸出指定圖形問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C語言的常量和字符串

    C語言的常量和字符串

    這篇文章主要為大家介紹了C語言常量和字符串,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C語言實現(xiàn)控制臺版貪吃蛇游戲

    C語言實現(xiàn)控制臺版貪吃蛇游戲

    這篇文章主要為大家詳細介紹了c語言貪吃蛇控制臺版,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • dev?c++的使用和調試方式

    dev?c++的使用和調試方式

    這篇文章主要介紹了dev?c++?的使用和調試方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • C語言實現(xiàn)單鏈表的快速排序算法

    C語言實現(xiàn)單鏈表的快速排序算法

    大家好,本篇文章主要講的是C語言實現(xiàn)單鏈表的快速排序算法,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 淺析設計模式中的代理模式在C++編程中的運用

    淺析設計模式中的代理模式在C++編程中的運用

    這篇文章主要介紹了設計模式中的代理模式在C++編程中的運用,代理模式最大的好處就是實現(xiàn)了邏輯和實現(xiàn)的徹底解耦,需要的朋友可以參考下
    2016-03-03

最新評論

卫辉市| 乐亭县| 揭东县| 高州市| 长治市| 鄄城县| 弥勒县| 兴隆县| 平顶山市| 包头市| 岳阳市| 额敏县| 大同县| 扎鲁特旗| 敦化市| 固镇县| 萝北县| 旅游| 安龙县| 莱阳市| 富锦市| 莎车县| 金昌市| 湟中县| 甘肃省| 新邵县| 房产| 安龙县| 来安县| 昌平区| 佛山市| 安平县| 长宁县| 盐津县| 沙洋县| 循化| 太原市| 磐安县| 辰溪县| 绵阳市| 屏山县|