src/examples/cpp03/timers/time_t_timer.cpp | src/examples/cpp11/timers/time_t_timer.cpp |
⋮ | ⋮ |
1 | // | 1 | // |
2 | //·time_t_timer.cpp | 2 | //·time_t_timer.cpp |
3 | //·~~~~~~~~~~~~~~~~ | 3 | //·~~~~~~~~~~~~~~~~ |
4 | // | 4 | // |
5 | //·Copyright·(c)·2003-2021·Christopher·M.·Kohlhoff·(chris·at·kohlhoff·dot·com) | 5 | //·Copyright·(c)·2003-2021·Christopher·M.·Kohlhoff·(chris·at·kohlhoff·dot·com) |
6 | // | 6 | // |
7 | //·Distributed·under·the·Boost·Software·License,·Version·1.0.·(See·accompanying | 7 | //·Distributed·under·the·Boost·Software·License,·Version·1.0.·(See·accompanying |
8 | //·file·LICENSE_1_0.txt·or·copy·at·http://www.boost.org/LICENSE_1_0.txt) | 8 | //·file·LICENSE_1_0.txt·or·copy·at·http://www.boost.org/LICENSE_1_0.txt) |
9 | // | 9 | // |
10 | | 10 | |
11 | #include·<asio.hpp> | 11 | #include·<asio.hpp> |
12 | #include·<ctime> | 12 | #include·<ctime> |
| 13 | #include·<chrono> |
13 | #include·<iostream> | 14 | #include·<iostream> |
14 | | 15 | |
15 | //·A·custom·implementation·of·the·Clock·concept·from·the·standard·C++·library. | 16 | //·A·custom·implementation·of·the·Clock·concept·from·the·standard·C++·library. |
16 | struct·time_t_clock | 17 | struct·time_t_clock |
17 | { | 18 | { |
18 | ··//·The·duration·type. | 19 | ··//·The·duration·type. |
19 | ··typedef·asio::chrono::steady_clock::duration·duration; | 20 | ··typedef·std::chrono::steady_clock::duration·duration; |
20 | | 21 | |
21 | ··//·The·duration's·underlying·arithmetic·representation. | 22 | ··//·The·duration's·underlying·arithmetic·representation. |
22 | ··typedef·duration::rep·rep; | 23 | ··typedef·duration::rep·rep; |
23 | | 24 | |
24 | ··//·The·ratio·representing·the·duration's·tick·period. | 25 | ··//·The·ratio·representing·the·duration's·tick·period. |
25 | ··typedef·duration::period·period; | 26 | ··typedef·duration::period·period; |
26 | | 27 | |
27 | ··//·An·absolute·time·point·represented·using·the·clock. | 28 | ··//·An·absolute·time·point·represented·using·the·clock. |
28 | ··typedef·asio::chrono::time_point<time_t_clock>·time_point; | 29 | ··typedef·std::chrono::time_point<time_t_clock>·time_point; |
29 | | 30 | |
30 | ··//·The·clock·is·not·monotonically·increasing. | 31 | ··//·The·clock·is·not·monotonically·increasing. |
31 | ··static·const·bool·is_steady·=·false; | 32 | ··static·constexpr·bool·is_steady·=·false; |
32 | | 33 | |
33 | ··//·Get·the·current·time. | 34 | ··//·Get·the·current·time. |
34 | ··static·time_point·now() | 35 | ··static·time_point·now()·noexcept |
35 | ··{ | 36 | ··{ |
36 | ····return·time_point()·+·asio::chrono::seconds(std::time(0)); | 37 | ····return·time_point()·+·std::chrono::seconds(std::time(0)); |
37 | ··} | 38 | ··} |
38 | }; | 39 | }; |
39 | | 40 | |
40 | //·The·asio::basic_waitable_timer·template·accepts·an·optional·WaitTraits | 41 | //·The·asio::basic_waitable_timer·template·accepts·an·optional·WaitTraits |
41 | //·template·parameter.·The·underlying·time_t·clock·has·one-second·granularity, | 42 | //·template·parameter.·The·underlying·time_t·clock·has·one-second·granularity, |
42 | //·so·these·traits·may·be·customised·to·reduce·the·latency·between·the·clock | 43 | //·so·these·traits·may·be·customised·to·reduce·the·latency·between·the·clock |
43 | //·ticking·over·and·a·wait·operation's·completion.·When·the·timeout·is·near | 44 | //·ticking·over·and·a·wait·operation's·completion.·When·the·timeout·is·near |
44 | //·(less·than·one·second·away)·we·poll·the·clock·more·frequently·to·detect·the | 45 | //·(less·than·one·second·away)·we·poll·the·clock·more·frequently·to·detect·the |
45 | //·time·change·closer·to·when·it·occurs.·The·user·can·select·the·appropriate | 46 | //·time·change·closer·to·when·it·occurs.·The·user·can·select·the·appropriate |
46 | //·trade·off·between·accuracy·and·the·increased·CPU·cost·of·polling.·In·extreme | 47 | //·trade·off·between·accuracy·and·the·increased·CPU·cost·of·polling.·In·extreme |
47 | //·cases,·a·zero·duration·may·be·returned·to·make·the·timers·as·accurate·as | 48 | //·cases,·a·zero·duration·may·be·returned·to·make·the·timers·as·accurate·as |
48 | //·possible,·albeit·with·100%·CPU·usage. | 49 | //·possible,·albeit·with·100%·CPU·usage. |
49 | struct·time_t_wait_traits | 50 | struct·time_t_wait_traits |
50 | { | 51 | { |
51 | ··//·Determine·how·long·until·the·clock·should·be·next·polled·to·determine | 52 | ··//·Determine·how·long·until·the·clock·should·be·next·polled·to·determine |
52 | ··//·whether·the·duration·has·elapsed. | 53 | ··//·whether·the·duration·has·elapsed. |
53 | ··static·time_t_clock::duration·to_wait_duration( | 54 | ··static·time_t_clock::duration·to_wait_duration( |
54 | ······const·time_t_clock::duration&·d) | 55 | ······const·time_t_clock::duration&·d) |
55 | ··{ | 56 | ··{ |
56 | ····if·(d·>·asio::chrono::seconds(1)) | 57 | ····if·(d·>·std::chrono::seconds(1)) |
57 | ······return·d·-·asio::chrono::seconds(1); | 58 | ······return·d·-·std::chrono::seconds(1); |
58 | ····else·if·(d·>·asio::chrono::seconds(0)) | 59 | ····else·if·(d·>·std::chrono::seconds(0)) |
59 | ······return·asio::chrono::milliseconds(10); | 60 | ······return·std::chrono::milliseconds(10); |
60 | ····else | 61 | ····else |
61 | ······return·asio::chrono::seconds(0); | 62 | ······return·std::chrono::seconds(0); |
62 | ··} | 63 | ··} |
63 | | 64 | |
64 | ··//·Determine·how·long·until·the·clock·should·be·next·polled·to·determine | 65 | ··//·Determine·how·long·until·the·clock·should·be·next·polled·to·determine |
65 | ··//·whether·the·absoluate·time·has·been·reached. | 66 | ··//·whether·the·absoluate·time·has·been·reached. |
66 | ··static·time_t_clock::duration·to_wait_duration( | 67 | ··static·time_t_clock::duration·to_wait_duration( |
67 | ······const·time_t_clock::time_point&·t) | 68 | ······const·time_t_clock::time_point&·t) |
68 | ··{ | 69 | ··{ |
69 | ····return·to_wait_duration(t·-·time_t_clock::now()); | 70 | ····return·to_wait_duration(t·-·time_t_clock::now()); |
70 | ··} | 71 | ··} |
71 | }; | 72 | }; |
72 | | 73 | |
73 | typedef·asio::basic_waitable_timer< | 74 | typedef·asio::basic_waitable_timer< |
74 | ··time_t_clock,·time_t_wait_traits>·time_t_timer; | 75 | ··time_t_clock,·time_t_wait_traits>·time_t_timer; |
75 | | 76 | |
76 | void·handle_timeout(const·asio::error_code&) | |
77 | { | |
78 | ··std::cout·<<·"handle_timeout\n"; | |
79 | } | |
80 | | |
81 | int·main() | 77 | int·main() |
82 | { | 78 | { |
83 | ··try | 79 | ··try |
84 | ··{ | 80 | ··{ |
85 | ····asio::io_context·io_context; | 81 | ····asio::io_context·io_context; |
86 | | 82 | |
87 | ····time_t_timer·timer(io_context); | 83 | ····time_t_timer·timer(io_context); |
88 | | 84 | |
89 | ····timer.expires_after(asio::chrono::seconds(5)); | 85 | ····timer.expires_after(std::chrono::seconds(5)); |
90 | ····std::cout·<<·"Starting·synchronous·wait\n"; | 86 | ····std::cout·<<·"Starting·synchronous·wait\n"; |
91 | ····timer.wait(); | 87 | ····timer.wait(); |
92 | ····std::cout·<<·"Finished·synchronous·wait\n"; | 88 | ····std::cout·<<·"Finished·synchronous·wait\n"; |
93 | | 89 | |
94 | ····timer.expires_after(asio::chrono::seconds(5)); | 90 | ····timer.expires_after(std::chrono::seconds(5)); |
95 | ····std::cout·<<·"Starting·asynchronous·wait\n"; | 91 | ····std::cout·<<·"Starting·asynchronous·wait\n"; |
96 | ····timer.async_wait(&handle_timeout); | 92 | ····timer.async_wait( |
| 93 | ········[](const·std::error_code&·/*error*/) |
| 94 | ········{ |
| 95 | ··········std::cout·<<·"timeout\n"; |
| 96 | ········}); |
97 | ····io_context.run(); | 97 | ····io_context.run(); |
98 | ····std::cout·<<·"Finished·asynchronous·wait\n"; | 98 | ····std::cout·<<·"Finished·asynchronous·wait\n"; |
99 | ··} | 99 | ··} |
100 | ··catch·(std::exception&·e) | 100 | ··catch·(std::exception&·e) |
101 | ··{ | 101 | ··{ |
102 | ····std::cout·<<·"Exception:·"·<<·e.what()·<<·"\n"; | 102 | ····std::cout·<<·"Exception:·"·<<·e.what()·<<·"\n"; |
103 | ··} | 103 | ··} |
104 | | 104 | |
105 | ··return·0; | 105 | ··return·0; |
106 | } | 106 | } |