From 5412fdacaf273bf3ce3230a078ff8ad156cc61a2 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sat, 14 Jun 2014 00:49:01 +0200 Subject: [PATCH] Add examples of how to read from a channel with a timeout, refs #13862 --- src/libsync/comm/mod.rs | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/libsync/comm/mod.rs b/src/libsync/comm/mod.rs index a7523eff04fec..842743657a6e4 100644 --- a/src/libsync/comm/mod.rs +++ b/src/libsync/comm/mod.rs @@ -120,6 +120,52 @@ //! }); //! rx.recv(); //! ``` +//! +//! Reading from a channel with a timeout requires to use a Timer together +//! with the channel. You can use the select! macro to select either and +//! handle the timeout case. This first example will break out of the loop +//! after 10 seconds no matter what: +//! +//! ```no_run +//! use std::io::timer::Timer; +//! +//! let (tx, rx) = channel::(); +//! let mut timer = Timer::new().unwrap(); +//! let timeout = timer.oneshot(10000); +//! +//! loop { +//! select! { +//! val = rx.recv() => println!("Received {}", val), +//! () = timeout.recv() => { +//! println!("timed out, total time was more than 10 seconds") +//! break; +//! } +//! } +//! } +//! ``` +//! +//! This second example is more costly since it allocates a new timer every +//! time a message is received, but it allows you to timeout after the channel +//! has been inactive for 5 seconds: +//! +//! ```no_run +//! use std::io::timer::Timer; +//! +//! let (tx, rx) = channel::(); +//! let mut timer = Timer::new().unwrap(); +//! +//! loop { +//! let timeout = timer.oneshot(5000); +//! +//! select! { +//! val = rx.recv() => println!("Received {}", val), +//! () = timeout.recv() => { +//! println!("timed out, no message received in 5 seconds") +//! break; +//! } +//! } +//! } +//! ``` // A description of how Rust's channel implementation works //