summaryrefslogtreecommitdiff
path: root/doc/html/boost_asio/example/cpp03/timers
diff options
context:
space:
mode:
authorChanho Park <chanho61.park@samsung.com>2014-12-11 18:55:56 +0900
committerChanho Park <chanho61.park@samsung.com>2014-12-11 18:55:56 +0900
commit08c1e93fa36a49f49325a07fe91ff92c964c2b6c (patch)
tree7a7053ceb8874b28ec4b868d4c49b500008a102e /doc/html/boost_asio/example/cpp03/timers
parentbb4dd8289b351fae6b55e303f189127a394a1edd (diff)
downloadboost-08c1e93fa36a49f49325a07fe91ff92c964c2b6c.tar.gz
boost-08c1e93fa36a49f49325a07fe91ff92c964c2b6c.tar.bz2
boost-08c1e93fa36a49f49325a07fe91ff92c964c2b6c.zip
Imported Upstream version 1.57.0upstream/1.57.0
Diffstat (limited to 'doc/html/boost_asio/example/cpp03/timers')
-rw-r--r--doc/html/boost_asio/example/cpp03/timers/tick_count_timer.cpp123
-rw-r--r--doc/html/boost_asio/example/cpp03/timers/time_t_timer.cpp93
2 files changed, 216 insertions, 0 deletions
diff --git a/doc/html/boost_asio/example/cpp03/timers/tick_count_timer.cpp b/doc/html/boost_asio/example/cpp03/timers/tick_count_timer.cpp
new file mode 100644
index 0000000000..aa84c84da7
--- /dev/null
+++ b/doc/html/boost_asio/example/cpp03/timers/tick_count_timer.cpp
@@ -0,0 +1,123 @@
+//
+// tick_count_timer.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2014 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#include <boost/asio.hpp>
+#include <ctime>
+#include <iostream>
+
+#if defined(WIN32)
+# include <windows.h>
+#else
+# error This example is for Windows only!
+#endif
+
+struct tick_count_traits
+{
+ // The time type. This type has no constructor that takes a DWORD to ensure
+ // that the timer can only be used with relative times.
+ class time_type
+ {
+ public:
+ time_type() : ticks_(0) {}
+ private:
+ friend struct tick_count_traits;
+ DWORD ticks_;
+ };
+
+ // The duration type. According to the TimeTraits requirements, the duration
+ // must be a signed type. This means we can't handle durations larger than
+ // 2^31.
+ class duration_type
+ {
+ public:
+ duration_type() : ticks_(0) {}
+ duration_type(LONG ticks) : ticks_(ticks) {}
+ private:
+ friend struct tick_count_traits;
+ LONG ticks_;
+ };
+
+ // Get the current time.
+ static time_type now()
+ {
+ time_type result;
+ result.ticks_ = ::GetTickCount();
+ return result;
+ }
+
+ // Add a duration to a time.
+ static time_type add(const time_type& t, const duration_type& d)
+ {
+ time_type result;
+ result.ticks_ = t.ticks_ + d.ticks_;
+ return result;
+ }
+
+ // Subtract one time from another.
+ static duration_type subtract(const time_type& t1, const time_type& t2)
+ {
+ // DWORD tick count values can wrap (see less_than() below). We'll convert
+ // to a duration by taking the absolute difference and adding the sign
+ // based on which is the "lesser" absolute time.
+ return duration_type(less_than(t1, t2)
+ ? -static_cast<LONG>(t2.ticks_ - t1.ticks_)
+ : static_cast<LONG>(t1.ticks_ - t2.ticks_));
+ }
+
+ // Test whether one time is less than another.
+ static bool less_than(const time_type& t1, const time_type& t2)
+ {
+ // DWORD tick count values wrap periodically, so we'll use a heuristic that
+ // says that if subtracting t1 from t2 yields a value smaller than 2^31,
+ // then t1 is probably less than t2. This means that we can't handle
+ // durations larger than 2^31, which shouldn't be a problem in practice.
+ return (t2.ticks_ - t1.ticks_) < static_cast<DWORD>(1 << 31);
+ }
+
+ // Convert to POSIX duration type.
+ static boost::posix_time::time_duration to_posix_duration(
+ const duration_type& d)
+ {
+ return boost::posix_time::milliseconds(d.ticks_);
+ }
+};
+
+typedef boost::asio::basic_deadline_timer<
+ DWORD, tick_count_traits> tick_count_timer;
+
+void handle_timeout(const boost::system::error_code&)
+{
+ std::cout << "handle_timeout\n";
+}
+
+int main()
+{
+ try
+ {
+ boost::asio::io_service io_service;
+
+ tick_count_timer timer(io_service, 5000);
+ std::cout << "Starting synchronous wait\n";
+ timer.wait();
+ std::cout << "Finished synchronous wait\n";
+
+ timer.expires_from_now(5000);
+ std::cout << "Starting asynchronous wait\n";
+ timer.async_wait(&handle_timeout);
+ io_service.run();
+ std::cout << "Finished asynchronous wait\n";
+ }
+ catch (std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/doc/html/boost_asio/example/cpp03/timers/time_t_timer.cpp b/doc/html/boost_asio/example/cpp03/timers/time_t_timer.cpp
new file mode 100644
index 0000000000..9ae42cee46
--- /dev/null
+++ b/doc/html/boost_asio/example/cpp03/timers/time_t_timer.cpp
@@ -0,0 +1,93 @@
+//
+// time_t_timer.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2014 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#include <boost/asio.hpp>
+#include <ctime>
+#include <iostream>
+
+struct time_t_traits
+{
+ // The time type.
+ typedef std::time_t time_type;
+
+ // The duration type.
+ struct duration_type
+ {
+ duration_type() : value(0) {}
+ duration_type(std::time_t v) : value(v) {}
+ std::time_t value;
+ };
+
+ // Get the current time.
+ static time_type now()
+ {
+ return std::time(0);
+ }
+
+ // Add a duration to a time.
+ static time_type add(const time_type& t, const duration_type& d)
+ {
+ return t + d.value;
+ }
+
+ // Subtract one time from another.
+ static duration_type subtract(const time_type& t1, const time_type& t2)
+ {
+ return duration_type(t1 - t2);
+ }
+
+ // Test whether one time is less than another.
+ static bool less_than(const time_type& t1, const time_type& t2)
+ {
+ return t1 < t2;
+ }
+
+ // Convert to POSIX duration type.
+ static boost::posix_time::time_duration to_posix_duration(
+ const duration_type& d)
+ {
+ return boost::posix_time::seconds(d.value);
+ }
+};
+
+typedef boost::asio::basic_deadline_timer<
+ std::time_t, time_t_traits> time_t_timer;
+
+void handle_timeout(const boost::system::error_code&)
+{
+ std::cout << "handle_timeout\n";
+}
+
+int main()
+{
+ try
+ {
+ boost::asio::io_service io_service;
+
+ time_t_timer timer(io_service);
+
+ timer.expires_from_now(5);
+ std::cout << "Starting synchronous wait\n";
+ timer.wait();
+ std::cout << "Finished synchronous wait\n";
+
+ timer.expires_from_now(5);
+ std::cout << "Starting asynchronous wait\n";
+ timer.async_wait(&handle_timeout);
+ io_service.run();
+ std::cout << "Finished asynchronous wait\n";
+ }
+ catch (std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}