为了账号安全,请及时绑定邮箱和手机立即绑定

动态更改代码间隔

动态更改代码间隔

Go
婷婷同学_ 2022-01-04 18:52:15
我想动态更改我的代码间隔。我已经写下一个例子来向你展示我是如何做到的。我的用例不是“加速度计”,但我希望它能给你一个想法。http://play.golang.org/p/6ANFnoE6pApackage mainimport (    "time"    "log"    "fmt")func main() {    interval := float64(1000)    ticker := time.NewTicker(time.Duration(interval) * time.Millisecond)    go func(){        counter := 1.0        for range ticker.C {            log.Println("ticker accelerating to " + fmt.Sprint(interval/counter) + " ms")            ticker = time.NewTicker(time.Duration(interval/counter) * time.Millisecond)            counter++        }        log.Println("stopped")    }()    time.Sleep(5 * time.Second)    log.Println("stopping ticker")    ticker.Stop()}有什么不对的是,自动收报机总是每秒钟“滴答”一下,而且不会加速……知道吗?
查看完整描述

3 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

遵循@fzerorubigd 的答案,但更完整一些。


如前所述,我们不能在range这种情况下使用 ,因为range循环缓存要删除的变量,然后它不能被覆盖(例如:http : //play.golang.org/p/yZvrgURz4o)


然后,我们应该使用for-select组合循环。此后的工作解决方案:


http://play.golang.org/p/3uJrAIhnTQ


package main


import (

    "time"

    "log"

    "fmt"

)


func main() {

    start_interval := float64(1000)

    quit := make(chan bool)


    go func(){

        ticker := time.NewTicker(time.Duration(start_interval) * time.Millisecond)

        counter := 1.0


        for {

            select {

            case <-ticker.C:

                log.Println("ticker accelerating to " + fmt.Sprint(start_interval/counter) + " ms")

                ticker.Stop()

                ticker = time.NewTicker(time.Duration(start_interval/counter) * time.Millisecond)

                counter++

            case <-quit:

                ticker.Stop()

                log.Println("..ticker stopped!")

                return

            }

        }

    }()


    time.Sleep(5 * time.Second)


    log.Println("stopping ticker...")

    quit<-true


    time.Sleep(500 * time.Millisecond) // just to see quit messages

}



查看完整回答
反对 回复 2022-01-04
?
潇湘沐

TA贡献1816条经验 获得超6个赞

正如 Nipun Talukdar 提到的,“for”捕获通道并使用相同的引用进行迭代。如果您像这样使用它,它会修复:


package main


import (

    "fmt"

    "log"

    "time"

)


func main() {

    interval := float64(1000)


    ticker := time.NewTicker(time.Duration(interval) * time.Millisecond)

    go func() {

        counter := 1.0

        for {

            select {

            case <-ticker.C:

                log.Println("ticker accelerating to " + fmt.Sprint(interval/counter) + " ms")

                ticker = time.NewTicker(time.Duration(interval/counter) * time.Millisecond)

                counter++

            }

        }

        log.Println("stopped")

    }()

    time.Sleep(5 * time.Second)

    log.Println("stopping ticker")

    ticker.Stop()

}


查看完整回答
反对 回复 2022-01-04
?
森林海

TA贡献2011条经验 获得超2个赞

这就是为什么在 go1.15ticker.Reset中创建的原因,您不需要创建新的股票代码更新现有股票代码的持续时间ticker.Reset("new duration"),现在您不会有任何缓存问题


package main


import (

    "fmt"

    "log"

    "time"

)


func main() {

    interval := float64(1000)


    ticker := time.NewTicker(time.Duration(interval) * time.Millisecond)

    go func(){

        counter := 1.0

        for range ticker.C {

            log.Println("ticker accelerating to " + fmt.Sprint(interval/counter) + " ms")

            ticker.Reset(time.Duration(interval/counter) * time.Millisecond)

            counter++

        }

        log.Println("stopped")

    }()

    time.Sleep(5 * time.Second)

    log.Println("stopping ticker")

    ticker.Stop()

}

您的示例存在缓存问题的原因是,当您ticker使用*time.ticker结构重新分配变量时,您只需取消原始*time.ticker结构与ticker变量的链接,但循环仍处于原始代码通道中,您需要将新循环重新分配给新的time.ticker.c


查看完整回答
反对 回复 2022-01-04
  • 3 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信