在结构中保留对 timer::guard 的引用

克里斯

我正在尝试实现一个跟踪全局刻度的结构。为了重构,我将 移动timer到结构中,但现在我面临着timer guard丢失引用的问题,因此计时器被丢弃。我的想法是将守卫添加为结构成员,但我不知道该怎么做。

use timer;
use chrono;
use futures::Future;
use std::{process, thread};
use std::sync::{Arc, Mutex};

struct GlobalTime {
    tick_count: Arc<Mutex<u64>>,
    millis: Arc<Mutex<i64>>,
    timer: timer::Timer,
    guard: timer::Guard,
}

impl GlobalTime {
    fn new() -> GlobalTime {
        GlobalTime {
            tick_count: Arc::new(Mutex::new(0)),
            millis: Arc::new(Mutex::new(200)),
            timer: timer::Timer::new(),
            guard: ???, // what do I do here to init the guard??
        }
    }

    fn tick(&self) {
        *self.guard = {
            let global_tick = self.tick_count.clone();
            self.timer.schedule_repeating(
                chrono::Duration::milliseconds(*self.millis.lock().unwrap()),
                move || {
                    *global_tick.lock().unwrap() += 1;
                    println!("timer callback");
                },
            );
        }
    }
}
彼得·霍尔

鉴于计时器并不总是在 的生命周期内运行GlobalTime,因此 并不总是有一个有效的值guard我们通常用一个来模拟这个想法Option

struct GlobalTime {
    tick_count: Arc<Mutex<u64>>,
    millis: Arc<Mutex<i64>>,
    timer: timer::Timer,
    guard: Option<timer::Guard>,
}

这也解决了您的初始值是什么的问题,因为它是Option::None

impl GlobalTime {
    fn new() -> GlobalTime {
        GlobalTime {
            tick_count: Arc::new(Mutex::new(0)),
            millis: Arc::new(Mutex::new(200)),
            timer: timer::Timer::new(),
            guard: None,
        }
    }
}

tick方法变为:

fn tick(&mut self) {
    let global_tick = self.tick_count.clone();
    let guard = self.timer.schedule_repeating(
        chrono::Duration::milliseconds(*self.millis.lock().unwrap()),
        move || {
            *global_tick.lock().unwrap() += 1;
            println!("timer callback");
        },
    );
    self.guard = Some(guard);
}

要停止计时器,您只需将保护值设置为Option::None

fn stop(&mut self) {
    self.guard = None;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Hibernate中保留循环引用

来自分类Dev

在CoreData中保留ABPerson的引用

来自分类Dev

如何在Unity中保留对粒子系统模块结构的引用

来自分类Javascript

在JavaScript原型函数中保留对“ this”的引用

来自分类Dev

在C#中保留对int的引用

来自分类Dev

ReplayKit-在ObjectiveC中保留对RPPreviewViewController的引用

来自分类Java

在Java中保留Timer.schedule的调用堆栈

来自分类Dev

Qt-在Python中保留小部件的引用

来自分类Java

在单例中保留对线程的引用是否安全?

来自分类Dev

在成员函数中保留对对象本身的引用

来自分类Dev

在新创建的活动中保留对线程的引用

来自分类Dev

WCF 服务未在服务中保留引用类型

来自分类Dev

gcc canaries:对__stack_chk_guard的未定义引用

来自分类Dev

如何在C ++ 14中保留左值引用的同时衰减右值引用类型?

来自分类Dev

在 JMESPath 查询中保留层次结构

来自分类Dev

在golang中保留嵌套结构

来自分类Dev

在Golang结构字段中保留类型

来自分类Dev

为什么要在结构中保留内存?

来自分类Dev

编辑现有对象时,如何在 Django 中保留引用?

来自分类Dev

在Forge Viewer中保留对项目的引用的最佳方法是什么?

来自分类Dev

通过在Neo4J中保留引用来选择和插入

来自分类Dev

有没有办法在 unordered_set 中保留对对象的引用/指针?

来自分类Dev

NSHashTable保留弱引用

来自分类Dev

保留引用并删除引用对象的SQL实践

来自分类Dev

在结构内部引用自己

来自分类Dev

自引用结构声明

来自分类Dev

传递对结构的方法引用

来自分类Dev

包装的结构引用

来自分类Dev

引用结构的类-分配