doubei5310 2017-05-31 16:08
浏览 21
已采纳

过早触发计时器

I have a loop that is sleeping for some period of time. However, elsewhere in my code I might need to end that sleep time prematurely so that the succeeding logic can be executed sooner.

for {
    timer = time.NewTimer(30 * time.Second)
    <-timer.C
    // Do something
}

Elsewhere…

// Trigger timer
// timer.Trigger() ??

Naturally, timer.Stop() will stop the timer, but it will then cause the program to hang and not drop down to // Do something. Currently, I am resetting the timer to a very small duration so that the timer will expire basically immediately.

timer.Reset(time.Millisecond)

Is there a better way to do this?

  • 写回答

1条回答 默认 最新

  • duanmangxie7131 2017-05-31 16:12
    关注

    You can use a cancellation channel:

    cancel := make(chan struct{})
    for {
        timer = time.NewTimer(30 * time.Second)
        select {
        case <- timer.C:
            doSomething()
        case <- cancel:
            doSomething()
        }
    }
    

    When you want to ignore the timer and execute immediately, just send a message on the cancel channel:

    cancel <- struct{}{}
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用