In meinem Projekt brauche ich etwas zu tun:Wie emimiere ich einen Timer in einem Objekt, das das Objekt periodisch mutiert?
use std::thread;
use std::time::Duration;
struct A {
pub ints: Vec<u8>,
}
impl A {
fn new() -> A {
let mut a = A {
ints: vec![1, 5, 6, 2, 3, 4],
};
a.timer();
a
}
fn timer(&mut self) {
thread::spawn(move || {
loop {
thread::sleep(Duration::from_millis(1));
self.ints.remove(0);
}
});
}
}
fn main() {
let a = A::new();
loop {
println!("Remaining elements: {:?}", a.ints);
}
}
Die Idee ist, dass einige struct einen Vektor der Elemente enthält. Diese Elemente sollten nach einiger Zeit aus dem Vektor entfernt werden. Stellen Sie sich einen periodischen Timer vor, der etwas überprüft und eine Aktion an einem veränderbaren Objekt ausführt (entfernt ein Element). Dieser Thread muss auch gelöscht werden, wenn das Objekt, an dem gerade gearbeitet wird, gelöscht wird. Ich denke, es sollte ein Mitglied einer Struktur sein, die manipuliert wird.
Das Problem mit dem Code oben ist, dass es eine Menge borrow Fehler hat, und ich verstehe nicht, wie das zu tun.
Ich habe wie dieses paar Fragen gesehen, aber jeder von ihnen war Skalar in einem Thread zu manipulieren. Der Grund, warum ich kann es hier nicht anwenden, weil der Faden etwas sein soll, die innerhalbA
Struktur ist und es soll remove
auf einem Vektor nennen, der ein Mitglied dieser Struktur ist.
Ich glaube, ich Arc
oder etwas ähnliches verwenden soll, aber nicht wirklich verstehen, wie es hier zu verwenden.
Noch eine Frage - wird dieser erzeugte Thread automatisch gelöscht, wenn die Lebenszeit eines 'A'-Objekts beendet ist? –
nein, dieser Thread läuft für immer, bis er in Panik gerät. Wenn Sie möchten, dass es zusammen mit 'A' gelöscht wird, müssen Sie das' JoinHandle' speichern, das von der Funktion 'spawn' im Objekt zurückgegeben wird, und' Drop' für 'A' implementieren und' join' auf dem Handle aufrufen. –
Hier ist auch eine Frage - wie kann ich die Objekte in einem solchen Vektor ändern? Zum Beispiel, wenn es ein Vektor einer Struktur ist, inkrementiere ein Feld innerhalb dieser Struktur? Alle Möglichkeiten, die ich ausprobiert habe, haben Fehler bezüglich "kann nicht ausgeliehenen Inhalt ausziehen" oder "das Merkmal' core :: iter :: Iterator "ist nicht implementiert für den Typ" & std :: sync :: mutex :: MutexGuard <' _, Sammlungen :: vec :: Vec> '". Nehmen wir 'Player' als eine Struktur an, die ein Feld hat, das ich in diesem Thread ändern muss. –