您好,登錄后才能下訂單哦!
這篇文章主要講解了C++11如何實(shí)現(xiàn)簡易定時(shí)器,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
定時(shí)器timer是多線程編程中經(jīng)常設(shè)計(jì)到的工具類
定時(shí)器的原理其實(shí)很簡單:
這里用C++11實(shí)現(xiàn)了一個(gè)簡單易用的定時(shí)器,包含兩種模式:
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; }
運(yùn)行結(jié)果
--- 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
看完上述內(nèi)容,是不是對(duì)C++11如何實(shí)現(xiàn)簡易定時(shí)器有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。