Вы не можете передать закрытие, которое фиксирует изменчивую ссылку на thread::spawn
.thread::spawn
требуется, чтобы эта функция была 'static
, что означает, что либо она не захватывает заимствования, либо все заимствования равны 'static
.Это связано с тем, что поток может продолжать работать после удаления референта.
Если вам не нужно использовать self
в исходном потоке после вызова start
, тогда вы можете просто передать self
с помощьюvalue.
pub fn start(self) {
self.acti = true;
thread::spawn(move || {
loop {
thread::sleep(Duration::from_secs(1));
if self.acti == true { self.time_tick(); }
self.print_time();
}
});
}
В противном случае вам нужно будет использовать Arc
, чтобы два потока могли разделить владение Self
, а также Mutex
или RwLock
для синхронизации операций чтения и записи между потоками.
// note: this is not a method anymore;
// invoke as `HMSTimer::start(arc.clone());`
pub fn start(this: Arc<Mutex<Self>>) {
this.lock().expect("mutex is poisoned").acti = true;
thread::spawn(move || {
loop {
thread::sleep(Duration::from_secs(1));
let lock = this.lock().expect("mutex is poisoned");
if lock.acti == true { lock.time_tick(); }
lock.print_time();
// `lock` is dropped here, unlocking the mutex
}
});
}