diff options
| author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2013-06-25 22:59:01 +0000 |
|---|---|---|
| committer | <> | 2013-09-27 11:49:28 +0000 |
| commit | 8c4528713d907ee2cfd3bfcbbad272c749867f84 (patch) | |
| tree | c09e2ce80f47b90c85cc720f5139089ad9c8cfff /libs/asio/example/cpp03/timers | |
| download | boost-tarball-baserock/morph.tar.gz | |
Imported from /home/lorry/working-area/delta_boost-tarball/boost_1_54_0.tar.bz2.boost_1_54_0baserock/morph
Diffstat (limited to 'libs/asio/example/cpp03/timers')
| -rw-r--r-- | libs/asio/example/cpp03/timers/Jamfile | 38 | ||||
| -rw-r--r-- | libs/asio/example/cpp03/timers/Jamfile.v2 | 51 | ||||
| -rw-r--r-- | libs/asio/example/cpp03/timers/tick_count_timer.cpp | 123 | ||||
| -rw-r--r-- | libs/asio/example/cpp03/timers/time_t_timer.cpp | 93 |
4 files changed, 305 insertions, 0 deletions
diff --git a/libs/asio/example/cpp03/timers/Jamfile b/libs/asio/example/cpp03/timers/Jamfile new file mode 100644 index 000000000..10a2f380e --- /dev/null +++ b/libs/asio/example/cpp03/timers/Jamfile @@ -0,0 +1,38 @@ +# +# Copyright (c) 2003-2013 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) +# + +subproject libs/asio/example/timers ; + +project boost : $(BOOST_ROOT) ; + +if $(UNIX) +{ + switch $(JAMUNAME) + { + case SunOS* : + { + SOCKET_LIBS = <find-library>socket <find-library>nsl ; + } + } +} + +template asio_timers_example + : <lib>@boost/libs/thread/build/boost_thread + <lib>@boost/libs/system/build/boost_system + : <include>$(BOOST_ROOT) + <include>../../../.. + <define>BOOST_ALL_NO_LIB=1 + <threading>multi + <mingw><*><find-library>ws2_32 + <mingw><*><find-library>mswsock + $(SOCKET_LIBS) + ; + +exe time_t_timer + : <template>asio_timers_example + time_t_timer.cpp + ; diff --git a/libs/asio/example/cpp03/timers/Jamfile.v2 b/libs/asio/example/cpp03/timers/Jamfile.v2 new file mode 100644 index 000000000..cd04d01ba --- /dev/null +++ b/libs/asio/example/cpp03/timers/Jamfile.v2 @@ -0,0 +1,51 @@ +# +# Copyright (c) 2003-2013 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) +# + +import os ; + +if [ os.name ] = SOLARIS +{ + lib socket ; + lib nsl ; +} +else if [ os.name ] = NT +{ + lib ws2_32 ; + lib mswsock ; +} +else if [ os.name ] = HPUX +{ + lib ipv6 ; +} + +exe time_t_timer + : time_t_timer.cpp + /boost/system//boost_system + : <define>BOOST_ALL_NO_LIB=1 + <threading>multi + <os>SOLARIS:<library>socket + <os>SOLARIS:<library>nsl + <os>NT:<define>_WIN32_WINNT=0x0501 + <os>NT,<toolset>gcc:<library>ws2_32 + <os>NT,<toolset>gcc:<library>mswsock + <os>NT,<toolset>gcc-cygwin:<define>__USE_W32_SOCKETS + <os>HPUX,<toolset>gcc:<define>_XOPEN_SOURCE_EXTENDED + <os>HPUX:<library>ipv6 + ; + +if [ os.name ] = NT +{ + # The tick_count_timer is for Windows only. + exe tick_count_timer + : tick_count_timer.cpp + /boost/system//boost_system + : <define>BOOST_ALL_NO_LIB=1 + <threading>multi + <os>NT,<toolset>gcc:<library>ws2_32 + <os>NT,<toolset>gcc:<library>mswsock + ; +} diff --git a/libs/asio/example/cpp03/timers/tick_count_timer.cpp b/libs/asio/example/cpp03/timers/tick_count_timer.cpp new file mode 100644 index 000000000..1cdde08cb --- /dev/null +++ b/libs/asio/example/cpp03/timers/tick_count_timer.cpp @@ -0,0 +1,123 @@ +// +// tick_count_timer.cpp +// ~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2013 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/libs/asio/example/cpp03/timers/time_t_timer.cpp b/libs/asio/example/cpp03/timers/time_t_timer.cpp new file mode 100644 index 000000000..4e784ba11 --- /dev/null +++ b/libs/asio/example/cpp03/timers/time_t_timer.cpp @@ -0,0 +1,93 @@ +// +// time_t_timer.cpp +// ~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2013 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; +} |
