在前面的例子里使用了一个精度只能到秒级别的定时器,对于一般应用来说,已经卓卓有余,能对付大多数的情况了。但有一天,老板让你开发一个对时间精度能到毫秒级别的定时器,就显得力不从心,左思右想不得其解。假如在嵌入式系统里,往往可以直接操作定时器来实现,但在PC系统里,就不能直接操作硬件了,更何况操作系统还存在进程调度的中断,因此定时器的精度就大大打折扣。在boost库里提供了boost::asio::high_resolution_timer类,就可以实现跨平台高精度的定时功能。比如串口通讯里,每间隔500毫秒就要获取一次数据,就可以使用这样的定时器。比如正在制作录像时,就可以使用这个定时器来实现视频与语音同步。high_resolution_timer定时器理论上可以达到纳秒数量级,因此可以满足任何精度的计时了。现在来详细看下面的例子:

// boost_018.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/asio/high_resolution_timer.hpp>
#include <iostream>void TaskRun(int nVal)
{//下面输出需要加锁,不能多个线程共享输出。static boost::mutex mutexCout;boost::lock_guard<boost::mutex> autoLock(mutexCout);std::cout << "TaskRun: " << nVal << std::endl;
}//封装线程组运行的类, 并且演示使用类成员函数作为线程组运行函数class CThreadBase
{//定义毫秒。typedef boost::chrono::duration<long long, boost::milli> milliseconds;
public:CThreadBase(void):m_Work(m_ioService),m_HighTimer(m_ioService){}void Start(int nMaxCount){       //循环地创建N个线程。for (int i = 0; i < nMaxCount; ++i){m_threadGroup.create_thread(boost::bind(&CThreadBase::Run, this, i));}}void Stop(void){//m_ioService.stop();//等所有线程退出。m_threadGroup.join_all();}//测试任务队列//软件开发人员: 蔡军生  2013-05-25//QQ: 9073204void TestTask(void){//放入几个任务。m_ioService.post(boost::bind(TaskRun, 1));m_ioService.post(boost::bind(TaskRun, 2));m_ioService.post(boost::bind(TaskRun, 3));  m_ioService.post(boost::bind(TaskRun, 4));m_ioService.post(boost::bind(TaskRun, 5));m_ioService.post(boost::bind(TaskRun, 6));  //第一次定时器启动。m_HighTimer.expires_from_now(milliseconds(500));m_HighTimer.async_wait(boost::bind(&CThreadBase::Wait, this, 5));}private:virtual void Run(int nVal){//运行队列里的任务。boost::system::error_code errorCode;m_ioService.run(errorCode);      }//void Wait(int nSeconds){         //下面输出需要加锁,不能多个线程共享输出。static boost::mutex mutexCout;boost::lock_guard<boost::mutex> autoLock(mutexCout);std::cout << "Wait: " << nSeconds << "ms" << std::endl;//下一次定时器。m_HighTimer.expires_from_now(milliseconds(5000));m_HighTimer.async_wait(boost::bind(&CThreadBase::Wait, this, 5));}private://定义一个任务队列。boost::asio::io_service m_ioService;boost::asio::io_service::work m_Work;//定义一个线程组对象。boost::thread_group m_threadGroup;  //创建高精度定时器boost::asio::high_resolution_timer m_HighTimer;};int _tmain(int argc, _TCHAR* argv[])
{//CThreadBase threadBase;//设置最大的线程个数。threadBase.Start(3);threadBase.TestTask();Sleep(20000);threadBase.Stop();system("pause");return 0;
}

从上面的例子,可以看到先包含头文件:

boost/asio/high_resolution_timer.hpp

接着定义毫秒的周期计时类型:

typedef boost::chrono::duration<long long, boost::milli>milliseconds;

然后就可以使用expires_from_now来计算定时器的时间了。这样就可以使用定时器周期性地工作,使用起来跟普通的定时器一样,没有太大的区别。

boost库在工作(25)任务之五相关推荐

  1. boost库在工作(20)线程之五

    通过上面的学习,基本上就可以使用线程了,但怎么样让线程运行类里的成员函数呢?以便封装得更方便使用了.接着下来,就看这个例子,如下: // boost_013.cpp : Defines the ent ...

  2. boost库在工作(23)任务之三

    在前面的多任务执行里,因为有多个线程执行,只要放到任务队列里的任务都会执行,但这些任务执行顺序是随机的,没有固定的顺序,也就是说放入队列早的任务不一定就是早执行,放入队列迟的任务也不一定后执行.这样没 ...

  3. 基于boost库的搜索引擎

    文章目录 一.项目介绍 二.搜索引擎相关的宏观原理 三.搜索引擎技术栈和项目环境 四.正排索引vs倒排索引-搜索引擎的具体原理 五.编写数据去标签与数据清洗的模块Parser 1.下载数据源 2.建立 ...

  4. vs2008安装boost库

    vs2008安装boost库 2010年06月10日 首先我在晚上找到了很多的说明:我先一一罗列在下 ************************************************* ...

  5. C/C++ 开发 boost 库参考手册整理(2) 【学习笔记】

    文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正.并且该文档在后期会随着学习的深入不断补充完善.感谢各位的参考查看. 笔记资料仅供学习交流使用,转载请标明出处 ...

  6. [转]C++ Boost库资料汇总

    http://www.usidcbbs.com/read-htm-tid-1397.html boost是一个准标准库,相当于STL的延续和扩充,它的设计理念和STL比较接近,都是利用泛型让复用达到最 ...

  7. Mysql依赖库Boost的源码安装,linux下boost库的安装

    boost'准标准库'安装过程. 安装的是boost_1_60_0. (1)首先去下载最新的boost代码包,网址www.boost.org. (2)进入到自己的目录,解压: bzip2 -d boo ...

  8. Linux下安装和使用boost库

    Linux下安装和使用boost库 2016-08-26 20:29:06 zhaomax 阅读数 349更多 分类专栏: C++ 用boost库中的serialization库.Boost库分为两个 ...

  9. 树莓派上安装boost库

    一.安装boost库 sudo apt-get install libboost-dev aptitude search boost 二.编写测试代码 1 #include <iostream& ...

最新文章

  1. sap business one 笑谈
  2. 让网管暴寒的网络故障(一笑了之)
  3. Tomcat意外宕机分析
  4. python毕业设计论文-25 行 Python 代码毕业设计实现人脸识别
  5. 产品成功之后的品牌策略
  6. Ansj中文分词Java开发词性分类
  7. 【DIY】最简单粗暴便宜的DIY定时器方法,没有之一
  8. perl基本语法--转载
  9. 探索式软件测试—Exploratory Software Testing
  10. Openlayers中设置定时绘制和清理直线图层
  11. 帷幕的帷是什么意思_“战斗民族”的鲜花礼品凭什么火遍全球?
  12. android 页面整体滑动,ScrollView 实现页面整体滑动
  13. 三大主流软件负载均衡器对比(LVS VS Nginx VS Haproxy)
  14. M1 Mac 屏幕截图录像工具:CleanShot X
  15. NTC热敏电阻温度计算
  16. 流媒体音视频开发和架构等
  17. Vue源码系列(一):Vue源码解读的正确姿势
  18. 贾俊平统计学思维导图- 第二章 数据搜集
  19. 1.1 统计学习方法概论(个人笔记与随感)
  20. solidity 重入攻击测试

热门文章

  1. OSChina 周三乱弹 —— 姑娘不是我的心上人,请自重
  2. Keras之TCN:基于keras框架利用时间卷积网络TCN算法对上海最高气温实现回归预测(把时间序列数据集转化为有监督学习数据集)案例
  3. 题目描述:设有一头小母牛,从出生第四年起每年生一头小母牛,按此规律,第N年时有几头母牛?
  4. PYTHON练习题---设有一头小母牛,从出生第四年起每年生一头小母牛
  5. OID夯实数据基础 保障数据安全 王希平教授受聘为圣笛数控专家顾问委员会委员
  6. woo语言使用sockets模拟http请求
  7. java创建user类在哪里_java中创建对象有哪几种方式
  8. 计算机使用的显示器主要有两类,2015年计算机专转本预测题及答案
  9. 好记性不如烂笔头之Java基础复习笔记
  10. PPT造电池,特斯拉电池日画一张“十年保质期”的大饼