c++定时器执行任务_#include

 

//
// Created by leoxae on 19-9-2.
//

#ifndef KEEKOAIROBOT_TIMERTASKHELPER_H
#define KEEKOAIROBOT_TIMERTASKHELPER_H

#include
#include
#include
#include
#include
#include
#include
class Timer{
public:
Timer() :expired_(true), try_to_expire_(false){
}

Timer(const Timer& t){
expired_ = t.expired_.load();
try_to_expire_ = t.try_to_expire_.load();
}
~Timer(){
Expire();
// std::cout << "timer destructed!" << std::endl;
}

void StartTimer(int interval, std::function task){
if (expired_ == false){
// std::cout << "timer is currently running, please expire it first..." << std::endl;
return;
}
expired_ = false;
std::thread([this, interval, task](){
while (!try_to_expire_){
std::this_thread::sleep_for(std::chrono::milliseconds(interval));
task();
}
// std::cout << "stop task..." << std::endl;
{
std::lock_guard locker(mutex_);
expired_ = true;
expired_cond_.notify_one();
}
}).detach();
}

void Expire(){
if (expired_){
return;
}

if (try_to_expire_){
// std::cout << "timer is trying to expire, please wait..." << std::endl;
return;
}
try_to_expire_ = true;
{
std::unique_lock locker(mutex_);
expired_cond_.wait(locker, [this]{return expired_ == true; });
if (expired_ == true){
// std::cout << "timer expired!" << std::endl;
try_to_expire_ = false;
}
}
}

template
void SyncWait(int after, callable&& f, arguments&&... args){

std::function::type()> task
(std::bind(std::forward(f), std::forward(args)...));
std::this_thread::sleep_for(std::chrono::milliseconds(after));
task();
}
template
void AsyncWait(int after, callable&& f, arguments&&... args){
std::function::type()> task
(std::bind(std::forward(f), std::forward(args)...));

std::thread([after, task](){
std::this_thread::sleep_for(std::chrono::milliseconds(after));
task();
}).detach();
}

private:
std::atomic expired_;
std::atomic try_to_expire_;
std::mutex mutex_;
std::condition_variable expired_cond_;
};
#endif //KEEKOAIROBOT_TIMERTASKHELPER_H

 

调用函数()

void timeTask(){
Timer t;
//周期性执行定时任务
// t.StartTimer(1000, std::bind(EchoFunc,"hello world!"));

cout << "开始识别==>>>>>" ;
for (int i = 0; i <= 100; i++){
cout << "第" << i << "张识别结果为:" << endl;
// t.StartTimer(1000,std::bind(zbarRec,i));
t.StartTimer(2000,std::bind(rec_NInstr,i));
// t.StartTimer(1000,std::bind(rapidjson3));
std::this_thread::sleep_for(std::chrono::seconds(2));
// std::this_thread::sleep_for(std::chrono::milliseconds(500));
t.Expire();
cout << ">>>>>>>" << endl;
}
// t.StartTimer(250,std::bind(zbarRec,i+1));
// std::this_thread::sleep_for(std::chrono::seconds(1));
// t.Expire();
std::cout << "try to expire timer!" << std::endl;

// //周期性执行定时任务
// t.StartTimer(1000, std::bind(EchoFunc, "hello c++11!"));
// std::this_thread::sleep_for(std::chrono::seconds(4));
// std::cout << "try to expire timer!" << std::endl;
// t.Expire();

// std::this_thread::sleep_for(std::chrono::seconds(2));

//只执行一次定时任务
//同步
// t.SyncWait(1000, EchoFunc, "hello world!");
//异步
// t.AsyncWait(1000, EchoFunc, "hello c++11!");

std::this_thread::sleep_for(std::chrono::seconds(2));
}

 

Talk is cheap. Show me the code