2016-05-03 14 views

risposta

7

È possibile utilizzare il timer cassa

extern crate timer; 
extern crate chrono; 

use timer::Timer; 
use chrono::Duration; 
use std::thread; 

fn x() { 
    println!("hello"); 
} 

fn main() { 
    let timer = Timer::new(); 
    let guard = timer.schedule_repeating(Duration::seconds(2), x); 
    // give some time so we can see hello printed 
    // you can execute any code here 
    thread::sleep(::std::time::Duration::new(10, 0)); 
    // stop repeating 
    drop(guard); 
} 
+0

Si può usare questo per aggiornare un campo in una struttura mutevole? – lsund

+0

@lsund Se intendi se sia possibile o meno lasciare un riferimento mutabile nella chiusura accessibile da altrove, dalla sorgente della cassa sembra che la risposta sia "no" tranne un "Mutex" o "Arco" ecc. Rif. a un globale 'Cella-e-amici (o codice 'non sicuro'). – user

+0

(e poi ci sono [canali] (https://doc.rust-lang.org/std/sync/mpsc/fn.channel.html) e [scoped_tls] (https://github.com/alexcrichton/scoped -tls/blob/master/src/lib.rs) e roba, ma alla fine è ancora necessario chiudere l'oggetto in un modo 'Send-ly ') – user

5

E 'abbastanza facile scrivere una versione simile da soli, utilizzando solo strumenti dalla libreria standard:

use std::thread; 
use std::time::Duration; 

struct Timer<F> { 
    delay: Duration, 
    action: F, 
} 

impl<F> Timer<F> 
where 
    F: FnOnce() + Send + Sync + 'static, 
{ 
    fn new(delay: Duration, action: F) -> Self { 
     Timer { delay, action } 
    } 

    fn start(self) { 
     thread::spawn(move || { 
      thread::sleep(self.delay); 
      (self.action)(); 
     }); 
    } 
} 

fn main() { 
    fn x() { 
     println!("hello"); 
     let t = Timer::new(Duration::from_secs(2), x); 
     t.start(); 
    } 

    let t = Timer::new(Duration::from_secs(2), x); 
    t.start(); 

    // Wait for output 
    thread::sleep(Duration::from_secs(10)); 
} 

Come pointed out by malbarbo, questo vuol creare una nuova thre annuncio per ogni timer. Questo può essere più costoso di una soluzione che riutilizza i thread ma è un esempio molto semplice.

+1

Si noti che può essere inefficiente allocare un nuovo thread in ogni invocazione 'start'. – malbarbo

+0

@malbarbo ottimo punto! Se si desidera un'attività ricorrente, è ** molto ** meglio usare sempre lo stesso thread più volte, il che presuppongo che la cassa del timer della risposta risponda. Stavo solo cercando di abbinare la semantica Python. – Shepmaster

Problemi correlati