1 //! Prints the elapsed time every 1 second and quits on Ctrl+C.
3 #[cfg(windows)] // signal_hook::iterator does not work on windows
5 println
!("This example does not work on Windows");
12 use std
::time
::{Duration, Instant}
;
14 use crossbeam_channel
::{bounded, select, tick, Receiver}
;
15 use signal_hook
::iterator
::Signals
;
16 use signal_hook
::SIGINT
;
18 // Creates a channel that gets a message every time `SIGINT` is signalled.
19 fn sigint_notifier() -> io
::Result
<Receiver
<()>> {
20 let (s
, r
) = bounded(100);
21 let signals
= Signals
::new(&[SIGINT
])?
;
23 thread
::spawn(move || {
24 for _
in signals
.forever() {
25 if s
.send(()).is_err() {
34 // Prints the elapsed time.
35 fn show(dur
: Duration
) {
37 "Elapsed: {}.{:03} sec",
39 dur
.subsec_nanos() / 1_000_000
43 let start
= Instant
::now();
44 let update
= tick(Duration
::from_secs(1));
45 let ctrl_c
= sigint_notifier().unwrap();
49 recv(update
) -> _
=> {
50 show(start
.elapsed());
52 recv(ctrl_c
) -> _
=> {
55 show(start
.elapsed());