我想动态更改我的自动收报机间隔。
我写了一个例子来告诉你我是怎么做的。我的用例不是“加速度计”,但我希望它能给你一个想法。
http://play.golang.org/p/6ANFnoE6pA
package main
import (
"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()
}
错误的是,股票代码每秒都会“嘀嗒”一次并且不会加速......有什么想法吗?
答案 0 :(得分:3)
回答@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
}
答案 1 :(得分:1)
正如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()
}
答案 2 :(得分:0)
这段代码呢?
https://play.golang.org/p/wyOTVxUW5Xj
package main
import (
"fmt"
"log"
"time"
)
func main() {
startInterval := float64(1000)
quit := make(chan bool)
go func() {
counter := 1.0
for {
select {
case <-time.After(time.Duration(startInterval/counter) * time.Millisecond):
log.Println("ticker accelerating to " + fmt.Sprint(startInterval/counter) + " ms")
counter++
case <-quit:
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
}
答案 3 :(得分:0)
为什么在go1.15 ticker.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