使用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 ...
随机推荐
- MRPT 安装使用
1. 安装mrpt ( apt-get ) $ sudo apt-get install mrpt-apps libmrpt-dev 2. 下载mrpt-1.3 链接:https://github.c ...
- C语言练手游戏-控制台输出一个会移动的坦克
把C语言的知识融合起来做一个练手的小游戏项目,将自己掌握到的数据结构.数组.函数.宏定义等知识综合利用,增加对语法的熟练程度. 操作系统: windows 10 x64 编译IDE : VS2015 ...
- [转]SPI通信原理简介
[转自]http://www.cnblogs.com/deng-tao/p/6004280.html 1.前言 SPI是串行外设接口(Serial Peripheral Interface)的缩写.是 ...
- ubuntu 下 teamview 取消自动启动 autostart
sudo teamviewer daemon disable
- jvm系列二、JVM内存结构
原文链接:http://www.cnblogs.com/ityouknow/p/5610232.html 所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemory ...
- (记录合并)union和union all的区别
SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION内部的SELECT语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条SE ...
- Day4--------------对文件的权限管理
一.文件权限 ls -l 显示当前文件详细信息 例: -rw-r--rwx.1 root root 1415 11月 9 20:21 anaconda-ks.cfg 依次顺序为:权限信 ...
- 【Android开源库】美团等APP城市选择
CityPicker 现在使用比较多的类似美团等APP的城市选择界面. 2步即可实现,就是这么简单粗暴! Gif image APK 下载demo.apk体验. Install Gradle: com ...
- javascript之随手笔记
1.toFixed()方法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 链接 2..在js中,{}等于new Object(),都是在堆中创建一块区域
- SeaJS入门教程系列之完整示例(三)
一个完整的例子上文说了那么多,知识点比较分散,所以最后我打算用一个完整的SeaJS例子把这些知识点串起来,方便朋友们归纳回顾.这个例子包含如下文件: 1.index.html——主页面.2.sea.j ...