使用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. Visual Studio Code 安装美化合集

    这是一个关于VSCode编辑器的各种配置. 你可以在这里找到VSCode 的各种操作,如果这里找不到,请移步官方文档C++ programming with Visual Studio Code以及各 ...

  2. 重学js之JavaScript 面向对象的程序设计(创建对象)

    注意: 本文章为 <重学js之JavaScript高级程序设计>系列第五章[JavaScript引用类型]. 关于<重学js之JavaScript高级程序设计>是重新回顾js基 ...

  3. YQL获取天气

    $(function () { $.getJSON("http://query.yahooapis.com/v1/public/yql?callback=?", { q: &quo ...

  4. 10 (OC)* Coretext

    CoreText实现 看上图,我们可以知道,一个View包括CTFrame,CTFrame中间包括许多行CTLine,而一个CTLine中包括许多CTRun 我们主要说说CTLine和CTRun   ...

  5. 脱离脚手架来配置、学习 webpack4.x (二)基础搭建loader 配置 css、scss

    序 上一篇已经把基本架子搭起来了,现在来增加css.scss.自动生成html.css 提前等方面的打包.webpack 默认只能处理js模块,所以其他文件类型需要做下转换,而loader 恰恰是做这 ...

  6. 【面试】我是如何在面试别人Redis相关知识时“软怼”他的

    事出有因 Redis是一个分布式NoSQL数据库,因其数据都存储在内存中,所以访问速度极快,因此几乎所有公司都拿它做缓存使用,所以Redis常被称为分布式缓存. 一次我的一个同事让我帮他看Redis相 ...

  7. 【linux】【sonarqube】安装sonarqube7.9

    前言 SonarQube 是一款用于代码质量管理的开源工具,它主要用于管理源代码的质量. 通过插件形式,可以支持众多计算机语言,比如 java, C#, go,C/C++, PL/SQL, Cobol ...

  8. 【ADO.NET--MVC】初学MVC(MVC入门)(1)

    最近一直在学MVC,本来今天想开始做项目了,但是一下手才发现还有好多好多都不懂,虽然想照搬别人的模板,但是还是觉得很虚,这也不懂哪也不懂.看来学习一门技术断不是那么简单,只要随便套套模板,看看别人代码 ...

  9. 11 种在大多数教程中找不到的JavaScript技巧

    当我开始学习JavaScript时,我把我在别人的代码.code challenge网站以及我使用的教程之外的任何地方发现的每一个节省时间的技巧都列了一个清单. 在这篇文章中,我将分享11条我认为特别 ...

  10. Ansible常用模块基本操作

    Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. 前言 对于任何一个框架,一个应用,为了更便于推广,便于使用,便于商业化,都会顺便提 ...