| 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-2023·Christopher·M.·Kohlhoff·(chris·at·kohlhoff·dot·com) | 5  | //·Copyright·(c)·2003-2023·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  | } |