做服务器前,先做些准备工作
首先是和时间相关的2个类
1. posix_time
同步
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
//过了5秒钟后来调用
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;
}
异步
#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;
}
同步和异步的区别就不解释了,具体内容可以百度
2. steady_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类
自定义time的作用:
1.可配置的,调用一次还是多次,还是无限调用
2.timer类可以被取消掉,比如跑10次,跑到第五次就可以取消掉
3.可以暂停几秒钟,比如:一局游戏,每个玩家只有15秒钟,但是突然有个玩家要发大招,可能要2秒中,这个时候就希望time类可以暂停2秒钟,把这个放大招的时间也考虑进去
这些功能都可以用boost/asio里面的time类来实现 |