2016-05-03 12 views

Antwort

7

Sie die timer Kiste verwenden können

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

Können Sie damit ein Feld in einer veränderbaren Struktur aktualisieren? – lsund

+0

@lsund Wenn du meinst, ob es möglich ist, eine veränderbare Referenz in der Schließung zu hinterlassen, die von wo anders zugänglich ist, sieht die Antwort aus wie die Antwort "nein" ist, wenn du nicht "Mutex" oder "Arc" d .ref zu einem 'Cell'-and-friends-globalen (oder' unsicheren') Code. – user

+0

(und dann gibt es [Kanäle] (https://doc.rust-lang.org/std/sync/mpsc/fn.channel.html) und [scoped_tls] (https://github.com/alexcrichton/scoped) -tls/blob/master/src/lib.rs) und Zeug, aber am Ende müssen Sie das Objekt noch immer "senden". – user

5

Es ist leicht genug, um eine ähnliche Version selbst, nur mit Werkzeugen schreiben aus der Standardbibliothek:

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)); 
} 

Als pointed out by malbarbo, so liegt ein neues dre schafft Anzeige für jeden Timer. Dies kann teurer sein als eine Lösung, die Threads wiederverwendet, aber es ist ein sehr einfaches Beispiel.

+1

Beachten Sie, dass es ineffizient sein kann, einen neuen Thread zuzuweisen jeder 'Start'-Aufruf. – malbarbo

+0

@ Malbarbo großer Punkt! Wenn Sie eine wiederkehrende Aufgabe haben wollen, ist es viel besser, den gleichen Thread immer und immer wieder zu verwenden, was ich von der Timer-Kiste aus Ihrer Antwort annehme. Ich habe nur versucht, die Python-Semantik zu finden. – Shepmaster

Verwandte Themen