博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost库在工作(25)任务之五
阅读量:4162 次
发布时间:2019-05-26

本文共 2674 字,大约阅读时间需要 8 分钟。

在前面的例子里使用了一个精度只能到秒级别的定时器,对于一般应用来说,已经卓卓有余,能对付大多数的情况了。但有一天,老板让你开发一个对时间精度能到毫秒级别的定时器,就显得力不从心,左思右想不得其解。假如在嵌入式系统里,往往可以直接操作定时器来实现,但在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 
#include
#include
#include
#include
#include
void TaskRun(int nVal){ //下面输出需要加锁,不能多个线程共享输出。 static boost::mutex mutexCout; boost::lock_guard
autoLock(mutexCout); std::cout << "TaskRun: " << nVal << std::endl;}//封装线程组运行的类, 并且演示使用类成员函数作为线程组运行函数class CThreadBase{ //定义毫秒。 typedef boost::chrono::duration
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: 9073204 void 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
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来计算定时器的时间了。这样就可以使用定时器周期性地工作,使用起来跟普通的定时器一样,没有太大的区别。

转载地址:http://zoixi.baihongyu.com/

你可能感兴趣的文章
php替换字符串函数strtr()和str_repalce()区别
查看>>
PHP 操作 MYSQL 创建数据库,表,字段
查看>>
最常用的PHP正则表达式收集整理
查看>>
Php中Get、Post提交怎样通过$_GET、$_POST、$_REQUEST获取
查看>>
Mysql语法
查看>>
揭开正则表达式的神秘面纱
查看>>
PHP获取客户端、PHP获取服务器相关信息
查看>>
PHP中全局变量$_SERVER的详细用法
查看>>
php获取mysql数据库中的所有表名
查看>>
PHP 的命令行模式
查看>>
php cli 方式 在crontab 中 运行解决
查看>>
Crontab及使用方法
查看>>
PHP CLI and Cron
查看>>
全面总结php在cli命令行模式下的使用
查看>>
Cron定时执行带参数的PHP代码
查看>>
PHP调用shell脚本注意事项
查看>>
PHP 命令行工具 shell_exec, exec, passthru, system
查看>>
php向MySQL datetime类型插入数据
查看>>
Linux下使用Mysql数据库
查看>>
php 读取MySQL中最后一条记录
查看>>