• 定时器


    io_service的任务执行流程:
    调用run方法,进入主loop;
    判断公有队列是否为空,不为空则取出任务并执行,当任务数大于1时同时唤醒其他空闲线程;
    任务执行结束,把各个线程的私有队里面的任务移动到公有任务队列里面。
    触发reactor,linux下面一般是epoll,当有事件时,把相应的事件的任务放到私有队列里。
    当队列为空时,把当前线程加到空闲线程队列里面,同时进入wait状态,等待其他线程的唤醒。
    当用户调用post时,任务是直接投递到公有队列里面。

    io_service.run():开始执行队列中的所有任务,直到任务执行完毕。

    同步定时器:

    #include <boost/thread.hpp>
    #include <boost/asio.hpp>
    #include <boost/date_time/posix_time/posix_time.hpp>
    
    int main()
    {
    	boost::asio::io_service ios; // 所有asio程序都必须要有一个io_service对象
    	boost::asio::deadline_timer t(ios, boost::posix_time::seconds(2)); // 定时器
    	std::cout << t.expires_at() << std::endl; // 查看定时器终止的绝对时间
    	t.wait(); // 同步等待
    	std::cout << "hello!" << std::endl;
    	return 0;
    }
    

      

    异步定时器:

    #include <boost/thread.hpp>
    #include <boost/asio.hpp>
    #include <boost/date_time/posix_time/posix_time.hpp>
    
    // error_code表示程序运行的错误
    void call_back(const boost::system::error_code& e)
    {
    	std::cout << "I am call_back." << std::endl;
    }
    
    int main()
    {
    	boost::asio::io_service ios; // 所有asio程序都必须要有一个io_service对象
    	boost::asio::deadline_timer t(ios, boost::posix_time::seconds(2)); // 定时器
    	t.async_wait(call_back); // 异步等待,传入回调函数
    	std::cout << "我在定时器前面" << std::endl;
    	ios.run(); // 等待异步操作完成,完成时io_service从操作系统获取执行结果,调用完成处理函数
    	return 0;
    }
    

      

    异步定时器使用bind

    #include <boost/thread.hpp>
    #include <boost/asio.hpp>
    #include <boost/date_time/posix_time/posix_time.hpp>
    
    class a_timer
    {
    private:
    	int count, count_max;
    	boost::function<void()> f; // 无参无返回的可调用用
    	boost::asio::deadline_timer t; // 定时器
    public:
    	template<typename F>
    	a_timer(boost::asio::io_service &ios, int x, F func) :
    		f(func), count_max(x), count(0), t(ios, boost::posix_time::millisec(500))
    	{
    		t.async_wait(boost::bind(&a_timer::call_func, this, _1)); // 注册回调函数
    	}
    	void call_func(const boost::system::error_code &e)
    	{
    		if (count > count_max)
    		{
    			return;
    		}
    		++count;
    		f();
    		t.expires_at(t.expires_at() + boost::posix_time::millisec(500));
    		t.async_wait(boost::bind(&a_timer::call_func, this, _1)); // 再次启动定时器
    	}
    };
    void print1()
    {
    	std::cout << "hello print1." << std::endl;
    }
    void print2()
    {
    	std::cout << "hello print2." << std::endl;
    }
    int main()
    {
    	boost::asio::io_service ios;
    	a_timer t1(ios, 5, print1);
    	a_timer t2(ios, 5, print2);
    	ios.run(); // 异步等待调用结束
    	return 0;
    }
    

      

  • 相关阅读:
    关于overflow:hidden的作用(溢出隐藏、清除浮动、解决外边距塌陷等等)
    float详解
    五 使用并美化网页文本
    代码校验工具 SublimeLinter 的安装与使用
    Sublime Text3 快捷键
    word选择+快捷键
    Word1-提取图片文字
    javascript window对象属性和方法
    word教程字体和段落设置
    Word2 word输入公式+文字转表格
  • 原文地址:https://www.cnblogs.com/ACGame/p/9111216.html
Copyright © 2020-2023  润新知