Rust 计时器在指定的超时后未触发

问题描述 投票:0回答:1

我在计时器方面遇到一些问题:我无法确定其无法正常工作的原因:

use std::sync::{Arc, Mutex};

use timer::Timer;

struct Counter {
    value: i32,
}

impl Counter {
    fn new() -> Self {
        Self { value: 0 }
    }

    fn increment(&mut self) {
        self.value += 1;
    }

    fn get_value(&self) -> i32 {
        self.value
    }
}

#[test]
fn test_1() {
    let counter = Arc::new(Mutex::new(Counter::new()));
    let counter_clone_1 = Arc::clone(&counter);
    let counter_clone_2 = Arc::clone(&counter_clone_1);

    // Arrange
    let callback = {
        move || {
            println!("Callback executed");
            counter_clone_1.lock().unwrap().increment();
        }
    };

    let timer = Timer::new();
    println!("Timer created");
    timer.schedule_with_delay(chrono::Duration::seconds(2), callback);

    // Assert initial value
    println!("Initial assert");
    assert_eq!(counter_clone_2.lock().unwrap().get_value(), 0);

    // Act
    println!("Sleeping for 4 seconds");
    std::thread::sleep(std::time::Duration::new(4, 0));

    // Assert incremented value
    println!("Final assert");
    assert_eq!(counter.lock().unwrap().get_value(), 1);
}

为什么在指定的超时时间后没有调用回调?

我尝试了多次超时(包括零)但没有成功,这是我看到的结果:

Timer created
Initial assert
Sleeping for 4 seconds
Final assert
thread 'missed_ping_timer_tests::test_1' panicked at tests\missed_ping_timer_tests.rs:51:5:
assertion `left == right` failed
  left: 0
 right: 1

这就是我的

Cargo.toml
文件中的内容:

[dependencies]
timer = "0.2.0"
chrono = "0.4.39" 
rust timer callback timeout
1个回答
0
投票

如果您阅读schedule_with_delay

上的文档,您会发现它说:

此方法返回一个

Guard
对象。如果
Guard
被删除,执行将被取消。

由于您没有将保护对象分配给任何变量,因此它会立即被删除并取消执行。

© www.soinside.com 2019 - 2024. All rights reserved.