wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Go on Windows中的高分辨率计时器(毫秒精度)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我正在尝试使用Go的时间.计时器安排需要以正确的顺序运行的任务,精度大约为半毫秒.这在OSX和 Linux上运行得非常好,但每次都在Windows上失败. 以下代码演示了此问题.它设置5个定时器,第一个为1 ms,第二个为2 ms,……,最后一个为5 ms.计时器触发后,会打印其编号.在OSX和Linux上,这显然产生了“12345”作为输出,但在Windows上,数字或多或少随机(在Win 7和
我正在尝试使用Go的时间.计时器安排需要以正确的顺序运行的任务,精度大约为半毫秒.这在OSX和 Linux上运行得非常好,但每次都在Windows上失败.

以下代码演示了此问题.它设置5个定时器,第一个为1 ms,第二个为2 ms,……,最后一个为5 ms.计时器触发后,会打印其编号.在OSX和Linux上,这显然产生了“12345”作为@L_696_4@,但在Windows上,数字或多或少随机(在Win 7和Windows Server 2012上测试).

package main

import (
    "fmt"
    "time"
)

func main() {
    var timer1,timer2,timer3,timer4,timer5 *time.Timer

    timer1 = time.NewTimer(1 * time.Millisecond)
    timer2 = time.NewTimer(2 * time.Millisecond)
    timer3 = time.NewTimer(3 * time.Millisecond)
    timer4 = time.NewTimer(4 * time.Millisecond)
    timer5 = time.NewTimer(5 * time.Millisecond)

    // should print 12345
    for {
        SELEct {
        case <-timer1.C:
            fmt.Print("1")
        case <-timer2.C:
            fmt.Print("2")
        case <-timer3.C:
            fmt.Print("3")
        case <-timer4.C:
            fmt.Print("4")
        case <-timer5.C:
            fmt.Print("5")
        case <-time.After(200 * time.Millisecond):
            return // exit the program
        }
    }
}

我认为这种行为是由于Go 1.6(https://golang.org/doc/go1.6#runtime,第4段)中所做的更改,其中Windows计时器精度从1毫秒减少到16毫秒,尽管它也应该以更短的间隔发生(大约100微秒)之前.

有没有办法将全局Windows计时器精度重置为1毫秒,或访问一个高分辨率计时器,使上面的例子工作?

解决方法

从Go 1.7开始,定时器现在具有更高的分辨率,不应该出现这个问题.

大佬总结

以上是大佬教程为你收集整理的Go on Windows中的高分辨率计时器(毫秒精度)全部内容,希望文章能够帮你解决Go on Windows中的高分辨率计时器(毫秒精度)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。