1+ use futures_channel:: oneshot;
12use std:: future:: pending;
2- use std:: thread;
33use std:: time:: Duration ;
44
55use gio:: prelude:: * ;
66
77use futures:: prelude:: * ;
88
9+ const TIMEOUT : Duration = Duration :: from_secs ( 3 ) ;
10+
911/// A very long task. This task actually never ends.
1012async fn a_very_long_task ( ) {
1113 println ! ( "Very long task started" ) ;
1214 pending ( ) . await
1315}
1416
15- fn main ( ) {
16- const TIMEOUT : Duration = Duration :: from_secs ( 3 ) ;
17+ #[ glib:: main]
18+ async fn main ( ) {
19+ let ( tx, rx) = oneshot:: channel ( ) ;
1720
18- let main_ctx = glib:: MainContext :: default ( ) ;
19- let main_loop = glib:: MainLoop :: new ( Some ( & main_ctx) , false ) ;
2021 let cancellable = gio:: Cancellable :: new ( ) ;
2122
22- {
23- let main_loop = main_loop. clone ( ) ;
24-
25- // We wrap `a_very_long_task` inside a `CancellableFuture` controlled by `cancellable`.
26- // The task is cancelled when `.cancel()` is invoked.
27- let cancellable_task = gio:: CancellableFuture :: new ( a_very_long_task ( ) , cancellable. clone ( ) )
28- . map ( move |res| {
29- if let Err ( error) = res {
30- println ! ( "{:?}" , error) ;
31- }
23+ // We wrap `a_very_long_task` inside a `CancellableFuture` controlled by `cancellable`.
24+ // The task is cancelled when `.cancel()` is invoked.
25+ let cancellable_task = gio:: CancellableFuture :: new ( a_very_long_task ( ) , cancellable. clone ( ) )
26+ . map ( move |res| {
27+ if let Err ( cancelled) = res {
28+ println ! ( "{:?}" , cancelled) ;
29+ }
3230
33- main_loop . quit ( ) ;
34- } ) ;
31+ tx . send ( ( ) ) . unwrap ( ) ;
32+ } ) ;
3533
36- main_ctx . spawn_local ( cancellable_task ) ;
37- }
34+ // Spawn the cancellable task.
35+ glib :: MainContext :: default ( ) . spawn ( cancellable_task ) ;
3836
3937 // We simulate a timeout here.
4038 // After `TIMEOUT` we cancel the pending task.
41- thread :: spawn ( move || {
42- thread :: sleep ( TIMEOUT ) ;
39+ glib :: MainContext :: default ( ) . spawn ( async move {
40+ glib :: timeout_future ( TIMEOUT ) . await ;
4341
4442 println ! (
4543 "Timeout ({:?}) elapsed! Cancelling pending task..." ,
@@ -49,5 +47,5 @@ fn main() {
4947 cancellable. cancel ( ) ;
5048 } ) ;
5149
52- main_loop . run ( ) ;
50+ rx . await . unwrap ( ) ;
5351}
0 commit comments