上一篇的方法主要使用的是:通过线程延时实

现的定时,并且只能定时一次,如果需要对此定时处理,就需要使用下面的定时器;

#include "stdafx.h"
#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::asio;
using namespace boost;
using namespace std; //循环状态
enum program_state
{
state1,
state2,
state3,
state4
}; /*
定时器类的作用:将外部类的超时函数传递进来后,在定时器超时函数中进行调用;
这样类之间的关系,清晰明了
*/
class ctimer
{
private:
int _timeout_len;
bool _is_remove_when_timeout;//
boost::function<void()> f; //委托函数类型为无参数无返回值
thread* ptrThread;
public:
//外部函数
//
~ctimer()
{
if (ptrThread != NULL)
{
delete this->ptrThread;
this->ptrThread = NULL;
}
}
template<typename F>
void InstallTimer(F f, int _timeout_len, bool _is_remove_when_timeout)
{
this->_timeout_len = _timeout_len;
this->_is_remove_when_timeout = _is_remove_when_timeout;
this->f = f;
//开启线程
ptrThread=new thread(bind(&ctimer::setTimer, this));
}
void RemoveTimer()
{
this->_is_remove_when_timeout = true;
this->_timeout_len = 1;
this->f = NULL;
}
//定时器线程工作者函数
void setTimer()
{ io_service m_ios; //设置定时器,并设置回调函数
deadline_timer t( m_ios, boost::posix_time::millisec(this->_timeout_len));
t.async_wait(bind(&ctimer::timeout,this));//回调 //阻塞在这里,等待事件
m_ios.run(); cout << "thread quit"<<endl;
}
//回调函数
void timeout()
{
//回调函数中调用外部的处理程序
if (this->f!=NULL)
this->f();
if (this->_is_remove_when_timeout == false)
{
thread(bind(&ctimer::setTimer, this));
}
}
}; //测试类,工作者主类
class TestClassA
{
public:
//定时器类对象
ctimer* ptrTimer;
TestClassA()
{
state = state1;
ptrTimer = new ctimer;
}
~TestClassA()
{
delete ptrTimer;
} //主程序当前状态
program_state state; //当前状态定时器超时处理函数
void TimeoutCallbackPrint()
{
printf(" TimeoutCallbackPrint\n"); ptrTimer->RemoveTimer();//直接关闭定时器
this->state = state2;
}
void run()
{
while (1)
{
//状态循环扫描
switch (this->state)
{
case state1:
proc_state1();
break;
case state2: break;
} }
}
//主程序当前状态,处理函数
void proc_state1()
{
//加入定时器,并将定时器回调函数的需要处理函数传入进去,并将参数传入
ptrTimer->InstallTimer(bind(&TestClassA::TimeoutCallbackPrint,this),500, false); //死循环,进行收发处理
while (this->state == state1)
{
}
}
}; int _tmain(int argc, _TCHAR* argv[])
{ TestClassA *tc = new TestClassA();
tc->run();//主程序在类中循环
getchar();
return 0;
}

使用boost线程定时器作为后台线程来切换主循环程序状态方法2的更多相关文章

  1. 【温故而知新-万花筒】C# 异步编程 逆变 协变 委托 事件 事件参数 迭代 线程、多线程、线程池、后台线程

    额基本脱离了2.0 3.5的时代了.在.net 4.0+ 时代.一切都是辣么简单! 参考文档: http://www.cnblogs.com/linzheng/archive/2012/04/11/2 ...

  2. 多线程&定时器Timer&同步&线程通信&ThreadLocal

    1.多线程 线程状态分为:新建状态.就绪状态.运行状态.阻塞状态.死亡状态 对象等待池的阻塞状态:运行状态执行了wait方法 对向锁池的阻塞状态:试图获得某个同步锁,已经被其他线程占用,就会放到对象的 ...

  3. C#夯实基础之多线程二:主线程、前台线程与后台线程

    我们在<C#夯实基础之多线程一:初识多线程>一文中第二部分中指出,既然windows最终发展出了多线程模型,按理说,我们直接使用一个.NetFramework的线程类就可以直接撸代码了,但 ...

  4. Java多线程之后台线程

    将线程设置成后台线程Daemons 主线程结果后,后台线程将自动结果. package wzh.test; import java.util.concurrent.TimeUnit; class Si ...

  5. Java多线程——<五>后台线程(daemon)

    一.后台线程(守护线程) 学一个东西,最重要的一点就是,为什么要用它? 后台线程区别于普通线程,普通线程又可以称为用户线程,只完成用户自己想要完成的任务,不提供公共服务.而有时,我们希望编写一段程序, ...

  6. java多线程总结二:后台线程(守护线程)

    所谓的后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分.因此当所有的非后台线程结束时,程序也就终止了,同时会杀死所有后台线程.反过来说,只要有任何非 ...

  7. java守护线程(后台线程)

    /*1.让各个对象或类相互灵活交流2.两个线程都冻结了,就不能唤醒了,因为根据代码要一个线程活着才能执行唤醒操作,就像玩木游戏3.中断状态就是冻结状态4.当主线程退出的时候,里面的两个线程都处于冻结状 ...

  8. C#扫盲之:前台线程后台线程

    1.线程分类 线程由程序员创建,可是创建的方式不同,总体来说有两种,一种是个人构造,也就是使用thread类new线程对象创建,这一类线程是大部分程序员知道的,也叫专用线程;还有一种是由CLR创建,这 ...

  9. C#.Net前台线程与后台线程的区别

    本文来自:http://www.cnblogs.com/zfanlong1314/archive/2012/02/26/2390455.html .Net的公用语言运行时(Common Languag ...

随机推荐

  1. SpringMVC 使用@ResponseBody返回json 中文乱码与返回实体类报错

    有时候我们发现接收的是中文,返回却是个?.这确实是个蛋疼的问题,Spring中解析字符串的转换器默认编码居然是ISO-8859-1 /** * Implementation of {@link Htt ...

  2. atof()函数 atol()

    atof()函数 atof():double atof(const char *str ); 功 能: 把字符串转换成浮点数 str:要转换的字符串. 返回值:每个函数返回 double 值,此值由将 ...

  3. Linux的记事本 Vi和Vim

    ⒈Vi和Vim的三种模式 ①正常模式 在正常模式下可以使用快捷键 默认进入的是正常模式 ②编辑模式(插入模式) 在该模式下可以输入内容 按下I,i,O,o,A,a,R,r等任何一个字母之后才可以进入该 ...

  4. string替换字符串,路径的斜杠替换为下划线

    场景 替换某个路径的所有"\"为"_". 很多时候取证需要把恶意代码文件取回来,然后清除. 如果在D:\WEB\模板制作插件\需要覆盖\CodeColoring ...

  5. python3之redis

    1.redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...

  6. 为caffe添加最简单的全通层AllPassLayer

    参考赵永科的博客,这里我们实现一个新 Layer,名称为 AllPassLayer,顾名思义就是全通 Layer,“全通”借鉴于信号处理中的全通滤波器,将信号无失真地从输入转到输出. 虽然这个 Lay ...

  7. 在Ubuntu中通过update-alternatives切换软件版本

    update-alternatives是ubuntu系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令.哪个软件版本,比如,我们在系统中同时安装了open jdk和sun ...

  8. jython获取was5.1的jvm监控参数

    perfName = AdminControl.completeObjectName ('type=Perf,process=server1,node=TSC,cell=TSC,*') perfONa ...

  9. git强制覆盖更新

    1.选择项目,右键选择Team,选择Team里面的Reset. 2.点击Reset后弹出Reset窗口,选择Hard选项,这样就会把远端的项目完全拉下来覆盖本地,本地没有的文件也会被创建,点击确定.

  10. Project Euler Problem 10

    Summation of primes Problem 10 The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of ...