boost::asio::io_service::定时器任务队列
使用io_service和定时器写的一个同步和异步方式的任务队列
#pragma once #include <string>
#include <iostream>
#include <functional>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <deque>
#include <mutex>
class task
{
public:
task();
~task(); void init();
void poll();
void run(); void post(std::string str); void handle_task(const boost::system::error_code& error);
protected:
boost::asio::io_service m_ioServer; std::deque<std::string> m_deque; boost::asio::deadline_timer m_taskTimer;
int m_taskTimeOut; std::mutex m_lock;
};
typedef boost::shared_ptr<task> taskRef;
#include "pch.h"
#include "task.h" task::task():
m_taskTimer(m_ioServer),
m_taskTimeOut()
{
} task::~task()
{
} void task::init()
{
m_taskTimer.expires_from_now(boost::posix_time::seconds(m_taskTimeOut));
m_taskTimer.async_wait(boost::bind(&task::handle_task, this, boost::asio::placeholders::error));
} void task::poll()
{
m_ioServer.poll();
} void task::run()
{
m_ioServer.run();
} void task::handle_task(const boost::system::error_code& error)
{
if (!error)
{
while (!m_deque.empty()) {
std::lock_guard<std::mutex> mut(m_lock);
std::string str = m_deque.front();
printf("task work %s\n", str.c_str());
}
m_taskTimer.expires_from_now(boost::posix_time::seconds(m_taskTimeOut));
m_taskTimer.async_wait(boost::bind(&task::handle_task, this, boost::asio::placeholders::error));
}
} void task::post(std::string str)
{
std::lock_guard<std::mutex> mut(m_lock);
m_deque.push_back(str);
}
#pragma once
#include "task.h"
#include <boost/thread/thread.hpp>
class TaskApp { public:
TaskApp() {};
~TaskApp() {}; void setTask() {
mTaskRef = taskRef(new task());
mTaskRef->init(); boost::thread thrd(&TaskApp::run, this);
} void run() { //同步阻塞方式
mTaskRef->run(); /* //异步方式
while (1)
{
mTaskRef->poll();
}*/
} void post_task(std::string str)
{
mTaskRef->post(str);
} protected:
taskRef mTaskRef;
};
int main()
{
TaskApp taskApp;
taskApp.setTask();
while ()
{
taskApp.post_task("hello");
std::this_thread::sleep_for(std::chrono::seconds());
}
}
boost::asio::io_service::定时器任务队列的更多相关文章
- boost::asio学习(定时器)
#include <boost/asio.hpp> #include <iostream> void handle1(const boost::system::error_co ...
- 概念理解:boost::asio::io_service
IO模型 io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象). asio::io_service i ...
- boost asio io_service学习笔记
构造函数 构造函数的主要动作就是调用CreateIoCompletionPort创建了一个初始iocp. Dispatch和post的区别 Post一定是PostQueuedCompletionSta ...
- boost::asio::io_service类
大部分使用Boost.Asio编写的代码都会使用几个io_service的实例.io_service是这个库里面最重要的类:它负责和操作系统打交道,等待所有异步操作的结束,然后为每一个异步操作调用其完 ...
- Boost::asio io_service 实现分析
io_service的作用 io_servie 实现了一个任务队列,这里的任务就是void(void)的函数.Io_servie最常用的两个接口是post和run,post向任务队列中投递任务,run ...
- boost asio 学习(六) 定时器
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=7 6 定时器 ...
- 概念理解:boost::asio::定时器1
同步定时器 #include <cstdio> #include <iostream> #include <boost/asio.hpp> #include < ...
- boost.asio系列——io_service
IO模型 io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象). asio::io_service i ...
- boost asio 学习(一)io_service的基础
原文 http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio/ 编译环境 b ...
随机推荐
- 解决chrome浏览器崩溃,再次安装不上问题
上网重新下载了个安装包,发现安装包都打不来 很绝望,查了很多资料 很多人说要删除注册表的东西 但是打开注册表,发现一堆google的东西,手动删根本不现实 在绝望中看到了解决方案:google Upd ...
- 松软科技课堂:Winform之TextBox
松软科技文(www.sysoft.net.cn): 文本框的几种模式:Multiline(多行).PasswordChar(密码)将文本框的PasswordChar设为*就是密码框效果,将MultiL ...
- ECSHOP完美解决Deprecated: preg_replace()报错的问题
随着PHP5.5 的普及,ECSHOP系统又爆出了新的错误.PHP发展到PHP5.5版本以后,有了很多细微的变化.而ECSHOP官方更新又太慢,发现这些问题后也不及时升级,导致用户安装使用过程中错误百 ...
- Anaconda、TensorFlow安装和Pycharm配置详细教程,亲测有效!
目录 1.Anaconda下载与安装 2.Anaconda安装成功与否测试 3.安装python 4.检查TensorFlow环境添加成功与否 5.TensorFlow安装 6.测试TensorFlo ...
- java数据结构——单链表、双端链表、双向链表(Linked List)
1.继续学习单链表,终于摆脱数组的魔爪了,单链表分为数据域(前突)和引用域(指针域)(后继),还有一个头结点(就好比一辆火车,我们只关心火车头,不关心其它车厢,只需知晓车头顺藤摸瓜即可),头结点没有前 ...
- 如何在服务器中安装mysql 以及安装禅道
安装mysql:以下命令在xshell 中输入: 1.卸载mysql :yum -y remove mysql* 2.查找mysql命名安装的所有文件: find / -name mysql 只能删 ...
- 日志 logging 代码格式
日志logging 格式代码 import logging looger = logging.getLogger() #创建一个空架子 创建一个文件句柄,用来记录日志(文件流) fh = loggin ...
- selenium-05-常见问题
一:日期控件 selenium不能直接对日期控件操作,可以通过js对日期控件做赋值操作 WebElement inputTimeBox=driver.findElement(by.name(" ...
- 从壹开始学习NetCore 45 ║ 终于解决了事务问题
一.项目说明 哈喽,又来写文章了,原来放假可以这么爽,可以学习和分享,
- Git项目分支分配
主要分支包含master分支与develop分支,临时分支可以分为: release: 从develop分出 ,是最终要发布的版本. feature: 实现某功能时推荐新建分支,从develop分出. ...