|
> よって、
> ・async_waitのイベントが呼ばれない形でタイマーを再設定する方法
> ・ユーザー定義のエラーコードの作成方法
> のどちらかが知りたいです
ユーザー定義のエラーコードの作成方法
#include <string>
#include <boost/system/error_code.hpp>
namespace api {
enum api_errors
{
timer_reset = 1
};
// エラーのカテゴリを作成
class api_category_impl
: public boost::system::error_category
{
public:
virtual const char* name() const { return "api error"; }
virtual std::string message(int ev) consessage(int ev) const
{
switch(ev)
{
case timer_reset:
return "timer reset";
default:
return "unknown";
}
}
};
static const api_category_impl api_category_instance;
inline const boost::system::error_category& get_api_category()
{
return api_category_instance;
}
} // namespace api
// error_conditionがシステムに依存しないユーザ定義用なのでerror_conditionに登録
namespace boost {
namespace system {
template<> struct is_error_condition_enum<api::api_errors>
{
static const bool value = true;
};
} // namespace system
} // namespace boost
namespace api {
// error_codeへの変換関数
inline boost::system::error_code make_error_code(api::api_errors e)
{
return boost::system::error_code(
static_cast<int>(e), get_api_category());
}
// if (error == api::timer_reset)が出来るようにするために以下を作成
inline boost::system::error_condition make_error_condition(api::api_errors e)
{
return boost::system::error_condition(
static_cast<int>(e), get_api_category());
}
} // namespace api
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/shared_ptr.hpp>
void handler(const boost::system::error_code& error, boost::shared_ptr<boost::asio::deadline_timer>& timer)
{
if (error == boost::asio::error::operation_aborted)
{
// キャンセル
std::cout << "Abort." << std::endl;
}
else if (error == api::timer_reset)
{
// タイマリセット
std::cout << "Try Again." << std::endl;
timer->expires_from_now(boost::posix_time::seconds(10));
timer->async_wait(boost::bind(&handler, _1, timer));
}
else
{
// Timer expired.
std::cout << "Timer expired." << std::endl;
}
}
int main()
{
boost::asio::io_service io_service;
// 30秒タイマ設定
boost::shared_ptr<boost::asio::deadline_timer> timer(
new boost::asio::deadline_timer(io_service, boost::posix_time::seconds(30)));
timer->async_wait(boost::bind(&handler, _1, timer));
// タイマキャンセル
timer->cancel();
// タイマを再設定
timer->get_io_service().post(boost::bind(&handler, api::make_error_code(api::timer_reset), timer));
io_service.run();
return 0;
}
|