鱼C论坛

 找回密码
 立即注册
查看: 4050|回复: 2

[技术交流] 《C++Boost库asio》第一篇

[复制链接]
发表于 2017-7-9 09:57:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
时间相关:延迟5秒
1.同步
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

int main() {
boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
t.wait();
std::cout << "hello, world!" << std::endl;
return 0;
}
2.异步
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

void callback(const boost::system::error_code&) {
std::cout << "Hello, world!" << std::endl;
}

void callback2(const boost::system::error_code&) {
std::cout << "second call but first run" << std::endl;
}

int main() {
boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
t.async_wait(callback);//注册事件,当过了5秒钟后来调用.
boost::asio::deadline_timer t(io, boost::posix_time::seconds(2));
t.async_wait(callback2);//注册事件,当过了2秒钟后来调用.
//虽然是后注册的事件,但是会被先调用,因为先满足条件的先调用,跟注册的顺序无关
std::cout << "start run\n";
io.run();//callback是在run里面执行的
std::cout << "finish run\n";
//什么时候会退出呢,当io.stop的时候,或者当消息池没有注册事件了,也就是事件都处理完了。
return 0;
}

新的timer
#include <boost/asio/steady_timer.hpp>//要单独引入,没有包含在asio这个头文件里,因为怕引

入多余的内容,所以把steady_timer.hpp从asio.hpp中分割开了
int main() {
boost::asio::io_service io;
boost::asio::steady_timer st(io);
同步:
st.expires_from_now(std::chrono::seconds(5));//从这一刻开始调用起,chrono时间库更精确
st.wait();//柱塞事;
异步:
?st.expires_from_now(std::chrono::seconds(5));
?t.async_wait(callback2);
std::cout << "hello world\n";
return 0;
}

自定义的time类作用:
1.可配置的,调用一次还是多次,还是无线调用
2.timer类可以被取消掉,比如跑10次,跑到第五次就可以取消掉
3.可以暂停几秒钟,比如:一局游戏,每个玩家只有15秒钟,但是突然有个玩家要发大招,可能要2秒

中,这个时候就希望time类可以暂停2秒钟,把这个放大招的时间也考虑进去
这些功能都可以用boost/asio里面的time类来实现

评分

参与人数 1鱼币 +8 收起 理由
小甲鱼 + 8 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-10 07:56:24 | 显示全部楼层
第一次在论坛发帖,写的比较乱。
以前在任何论坛,都是看帖子,从来没发过帖子。
这次小甲鱼大神举办活动,一定要支持下。
这个论坛真的很不错,希望越办越好,能在这里学习一辈子,跟着大家一起进步。

建了一个,《C++Boost库asio》学习笔记,已经发了6篇
发完后才发现,排版很乱,现在慢慢的在下面回帖来整理下

在看了小甲鱼大神的《C++快速入门》后,想用C++的Boost库里的Asio搭个简单的服务器

首先是下载VS2017
VS2017

安装Boost库
这个过程折腾了很久,我放出折腾过程中的网址,不懂的可以回帖问我,这里就不具体写出来
Boost1.62.0 + VS2015 默认编译与配置
http://www.jianshu.com/p/93b52d90cd92
http://www.cnblogs.com/zhcncn/p/3950477.html
如何使用VS2017编译boost

如果你是使用CodeBlocks的,可以参考下下面2个网址(都是百度里找到的帖子
(CodeBlocks+MingW)安装和使用Boost
CodeBlocks配置TDM-GCC编译环境

最后给大家推荐我在学的一个不错的《Boost库asio》网络教程
Boost.Asio C++ 网络编程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-10 09:13:46 | 显示全部楼层
做服务器前,先做些准备工作

首先是和时间相关的2个类

1. posix_time

同步

  1. #include <iostream>
  2. #include <boost/asio.hpp>
  3. #include <boost/date_time/posix_time/posix_time.hpp>
  4. //过了5秒钟后来调用
  5. int main() {
  6.     boost::asio::io_service io;
  7.     boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
  8.     t.wait();
  9.     std::cout << "hello, world!" << std::endl;
  10.     return 0;
  11. }
复制代码


异步

  1. #include <iostream>
  2. #include <boost/asio.hpp>
  3. #include <boost/date_time/posix_time/posix_time.hpp>

  4. void callback(const boost::system::error_code&) {
  5.     std::cout << "Hello, world!" << std::endl;
  6. }

  7. void callback2(const boost::system::error_code&) {
  8.     std::cout << "second call but first run" << std::endl;
  9. }

  10. int main() {
  11.     boost::asio::io_service io;
  12.     boost::asio::deadline_timer t(io,      boost::posix_time::seconds(5));
  13. t.async_wait(callback);//注册事件,当过了5秒钟后来调用.
  14.     boost::asio::deadline_timer t(io,   boost::posix_time::seconds(2));
  15. t.async_wait(callback2);//注册事件,当过了2秒钟后来调用.
  16. //虽然是后注册的事件,但是会被先调用,因为先满足条件的先调用,跟注册的顺序无关
  17.     std::cout << "start run\n";
  18. io.run();//callback是在run里面执行的
  19.     std::cout << "finish run\n";
  20. //什么时候会退出呢,当io.stop的时候,或者当消息池没有注册事件了,也就是事件都处理完了。
  21. return 0;
  22. }
复制代码


同步和异步的区别就不解释了,具体内容可以百度

2. steady_timer(个人推荐)

  1. #include <boost/asio/steady_timer.hpp>//要单独引入,没有包含在asio这个头文件里,因为怕引

  2. 入多余的内容,所以把steady_timer.hpp从asio.hpp中分割开了
  3. int main() {
  4.     boost::asio::io_service io;
  5.     boost::asio::steady_timer st(io);

  6.     //同步:       st.expires_from_now(std::chrono::seconds(5));//从这一刻开始调用起,chrono时间库更精确
  7.     st.wait();//柱塞事;
  8. //异步:
  9.     st.expires_from_now(std::chrono::seconds(5));
  10. ?t.async_wait(callback2);
  11.     std::cout << "hello world\n";
  12.     return 0;
  13. }
复制代码


等简单服务器搭完后,我会写个自定义的time类

自定义time的作用:

1.可配置的,调用一次还是多次,还是无限调用
2.timer类可以被取消掉,比如跑10次,跑到第五次就可以取消掉
3.可以暂停几秒钟,比如:一局游戏,每个玩家只有15秒钟,但是突然有个玩家要发大招,可能要2秒中,这个时候就希望time类可以暂停2秒钟,把这个放大招的时间也考虑进去

这些功能都可以用boost/asio里面的time类来实现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-9 01:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表