使用boost线程定时器作为后台线程来切换主循环程序状态方法2
上一篇的方法主要使用的是:通过线程延时实
现的定时,并且只能定时一次,如果需要对此定时处理,就需要使用下面的定时器;
#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的更多相关文章
- 【温故而知新-万花筒】C# 异步编程 逆变 协变 委托 事件 事件参数 迭代 线程、多线程、线程池、后台线程
额基本脱离了2.0 3.5的时代了.在.net 4.0+ 时代.一切都是辣么简单! 参考文档: http://www.cnblogs.com/linzheng/archive/2012/04/11/2 ...
- 多线程&定时器Timer&同步&线程通信&ThreadLocal
1.多线程 线程状态分为:新建状态.就绪状态.运行状态.阻塞状态.死亡状态 对象等待池的阻塞状态:运行状态执行了wait方法 对向锁池的阻塞状态:试图获得某个同步锁,已经被其他线程占用,就会放到对象的 ...
- C#夯实基础之多线程二:主线程、前台线程与后台线程
我们在<C#夯实基础之多线程一:初识多线程>一文中第二部分中指出,既然windows最终发展出了多线程模型,按理说,我们直接使用一个.NetFramework的线程类就可以直接撸代码了,但 ...
- Java多线程之后台线程
将线程设置成后台线程Daemons 主线程结果后,后台线程将自动结果. package wzh.test; import java.util.concurrent.TimeUnit; class Si ...
- Java多线程——<五>后台线程(daemon)
一.后台线程(守护线程) 学一个东西,最重要的一点就是,为什么要用它? 后台线程区别于普通线程,普通线程又可以称为用户线程,只完成用户自己想要完成的任务,不提供公共服务.而有时,我们希望编写一段程序, ...
- java多线程总结二:后台线程(守护线程)
所谓的后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分.因此当所有的非后台线程结束时,程序也就终止了,同时会杀死所有后台线程.反过来说,只要有任何非 ...
- java守护线程(后台线程)
/*1.让各个对象或类相互灵活交流2.两个线程都冻结了,就不能唤醒了,因为根据代码要一个线程活着才能执行唤醒操作,就像玩木游戏3.中断状态就是冻结状态4.当主线程退出的时候,里面的两个线程都处于冻结状 ...
- C#扫盲之:前台线程后台线程
1.线程分类 线程由程序员创建,可是创建的方式不同,总体来说有两种,一种是个人构造,也就是使用thread类new线程对象创建,这一类线程是大部分程序员知道的,也叫专用线程;还有一种是由CLR创建,这 ...
- C#.Net前台线程与后台线程的区别
本文来自:http://www.cnblogs.com/zfanlong1314/archive/2012/02/26/2390455.html .Net的公用语言运行时(Common Languag ...
随机推荐
- 【Ehcache】ehcache2.5.2缓存的使用
缓存的名字是ehcache...老是记得是encache.... 官方PDF文档:http://www.ehcache.org/documentation/ehcache-2.5.x-document ...
- 关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决
转自:http://hi.baidu.com/qinfengxiaoyue/item/ff262ccfb53b4c2ba0b50a89 引自:http://blog.csdn.net/sptoor/a ...
- atof()函数 atol()
atof()函数 atof():double atof(const char *str ); 功 能: 把字符串转换成浮点数 str:要转换的字符串. 返回值:每个函数返回 double 值,此值由将 ...
- 董事局主席董事长总裁首席执行官CEO总裁董事监事区别
董事长是公司的最大股东:董事长是董事会的主席,一般是企业的所有者,掌握企业的股权并且决定企业的发展策略. 董事局主席通常是在大财团中才会出现,董事局主席管数个董事长,一个大财团涉及很多方面的业务,因此 ...
- C#哈希表(HashTable)和Dictionary比较
添加数据时Hashtable快.频繁调用数据时Dictionary快. Dictionary<K,V>是泛型的,当K或V是值类型时,其速度远远超过Hashtable. using Syst ...
- [学习笔记]JS 数组Array push相关问题
前言: 今天用写了一个二维数组,都赋值为零,然后更新其中一个值,结果和预期是不一样,会整列的相同位置都是同一个值. 1.用Chrome的控制台样例如下: arrs[2][2] =1的赋值,竟然是三个数 ...
- expdp和impdp快速导出导入,不用创建虚拟目录
expdp 和impdp不用创建虚拟目录:在cmd直接 expdp 用户名/密码 回车 就导出了,(如果提示输入用户名和密码就输入).再将导出的文件放在oracle默认的dpdump文件夹里面,然 ...
- Map<String,String>集合的四种遍历方式 其中有一种针对大容量的数据集合
- poj2528贴海报,,
对于区间段的离散化需要注意一下,和点离散化不同 离散后如何识别一段区间还是一段区间,而不是两个顶点,就是如果两个点的距离大于1,就往离散的数据里插入一个中间值,即用三个点来表示一段区间 /* 离散化长 ...
- python+selenium四:iframe查看、定位、切换
iframe是HTML里面嵌套HTML的一种框架 1.查看iframe 1.Top Window:可直接定位 2.iframe#i:说明此元素在iframe上 3.iframe显示为空:(id或nam ...