使用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 ...
随机推荐
- Hadoop的RPC机制及简单实现
1.RPC简介 Remote Procedure Call 远程过程调用协议 RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些 ...
- JS实现随机背景图片与图片大小变换的效果
经常在网上见一些网站访问一次背景图片改变一次,而且图片的大小不停变换,于是想着自己研究一下. 背景图片可以通过JS的随机数来改变图片的src来实现随机图片,图片的大小变换可以用JS的setInterv ...
- curl命令下载jdk
第一步:找到下载地址 第二步:下载
- 【逆向工具】逆向工具101editor使用-游戏快速通关
[渡者游戏简介] 船夫小江将运送客人的,羊.狐狸.草等物品过河,如果留下动物被其它种类吃掉任务就失败了.你需要帮助他做出正确的顺序选择.Ferryman是一款根据经典谜题改编的解谜游戏. 一.查看文件 ...
- 『实践』Matlab实现Flyod求最短距离及存储最优路径
Matlab实现Flyod求最短距离及存储最优路径 一.实际数据 已知图中所有节点的X.Y坐标. 图中的节点编号:矩阵中的编号 J01-J62:1-62; F01-F60:63-122; Z01-Z0 ...
- 转载:《理解OAuth 2.0》 阮一峰
原文:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛 ...
- javascript 练习题目答案
//廖雪峰的博客的这个教程的答案//https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb300 ...
- OneNET麒麟座应用开发之八:采集大气压力等环境参数
采集大气压力和温度也是核算大气标准状况下的各种数据的必须参数,为此我们必须知道压力和温度才能计算标准状况下的各种参数,于此我们需要一个既能检测压力也能检测温度的元件. 1.硬件概述 MS5837压力传 ...
- OneNET麒麟座应用开发之五:获取加速度传感器ADXL345数据
由于数据采集站基本都安装在野外或者楼顶,安装位置以及震动对检测数据的准确性有一定影响.所以想要有一个位置状态数据,正好发现麒麟作上有ADXL345,这样一个数字输出的加速度传感器.如图中红框所示: 1 ...
- Guice 依赖绑定
Guice 依赖绑定 连接绑定(Linked Bingdings) 连接绑定是 Guice 最基本的一种绑定方式.这种绑定方式我们需要在自己定义的 Module 的 configure() 中编写绑定 ...