使用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::定时器任务队列的更多相关文章

  1. boost::asio学习(定时器)

    #include <boost/asio.hpp> #include <iostream> void handle1(const boost::system::error_co ...

  2. 概念理解:boost::asio::io_service

    IO模型 io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象). asio::io_service i ...

  3. boost asio io_service学习笔记

    构造函数 构造函数的主要动作就是调用CreateIoCompletionPort创建了一个初始iocp. Dispatch和post的区别 Post一定是PostQueuedCompletionSta ...

  4. boost::asio::io_service类

    大部分使用Boost.Asio编写的代码都会使用几个io_service的实例.io_service是这个库里面最重要的类:它负责和操作系统打交道,等待所有异步操作的结束,然后为每一个异步操作调用其完 ...

  5. Boost::asio io_service 实现分析

    io_service的作用 io_servie 实现了一个任务队列,这里的任务就是void(void)的函数.Io_servie最常用的两个接口是post和run,post向任务队列中投递任务,run ...

  6. boost asio 学习(六) 定时器

    http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=7 6 定时器 ...

  7. 概念理解:boost::asio::定时器1

    同步定时器 #include <cstdio> #include <iostream> #include <boost/asio.hpp> #include < ...

  8. boost.asio系列——io_service

    IO模型 io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象). asio::io_service i ...

  9. boost asio 学习(一)io_service的基础

    原文  http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio/ 编译环境 b ...

随机推荐

  1. [C++] 头文件中不要用using namespace std

    先总结下: 1. using namespce std:尽量不要(或者强硬一点,不许)在头文件中使用. 解析: 不让这么用,主要原因就是防止名字重复(即自定义变量名和std中名字重复),因为头文件会被 ...

  2. java数据结构——递归(Recursion)例题持续更新中

    继续学习数据结构递归,什么是递归呢?字面理解就是先递出去,然后回归,递归核心思想就是直接或间接调用本身,好比从前有座山,山里有位老和尚,在给小和尚讲故事,讲的是从前有座山,山里有位老和尚,在给小和尚讲 ...

  3. CreateFolder

    import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apac ...

  4. C#实现请求唯一性校验支持高并发

    使用场景描述: 网络请求中经常会遇到发送的请求,服务端响应是成功的,但是返回的时候出现网络故障,导致客户端无法接收到请求结果,那么客户端程序可能认为判断为网络故障,而重复发送同一个请求.当然如果接口中 ...

  5. SpringBoot -> @Import使用

    @Import 注解出自spring-context包中 package org.springframework.context.annotation; import java.lang.annota ...

  6. 【ADO.NET基础】后台获取前台控件

    C# 后台获取前台 input 文本框值.string aa=Request.Form[headself]; 那么要是后台给前台input文本框赋值呢? 后台 public string Headse ...

  7. android系统中对ffmpeg封装最好的免费SDK

    android系统中对ffmpeg封装最好的免费SDK; 无论个人还是公司,都免费商用, 欢迎下载. https://github.com/LanSoSdk/LanSoEditor_common 可能 ...

  8. Kubernetes 系列(六):持久化存储 PV与PVC

    在使用容器之后,我们需要考虑的另外一个问题就是持久化存储,怎么保证容器内的数据存储到我们的服务器硬盘上.这样容器在重建后,依然可以使用之前的数据.但是显然存储资源和 CPU 资源以及内存资源有很大不同 ...

  9. 理解 Redux 的中间件

    将该思想抽象出来,其实和 Redux 就无关了.问题变成,怎样实现在截获函数的执行,以在其执行前后添加自己的逻辑. 为了演示,我们准备如下的示例代码来模拟 Redux dispatch action ...

  10. Transactional事务提交后触发异步方法

    一.问题复现 1.场景 2个service方法, 方法A中调用方法B. 方法A 是核心业务方法,涉及多张表数据变更,为了保持数据一致,用spring事务注解:@Transactional(rollba ...