【发布时间】:2019-08-31 19:35:20
【问题描述】:
Window 对 Thread.Sleep() 的默认精度为 15.625 ms (1000 / 64),即如果您调用 Thread.Sleep(1),则经过的时间为 15 ms 或 16 ms。我想将精度提高到 1 毫秒。
有一个函数“timeBeginPeriod”可以改变精度。但我没有得到我想要的。这是我的代码:
[DllImport("winmm.dll", EntryPoint = "timeBeginPeriod")]
public static extern void TimeBeginPeriod(int t);
[DllImport("winmm.dll", EntryPoint = "timeEndPeriod")]
public static extern void TimeEndPeriod(int t);
TimeBeginPeriod(1);
var t1 = Environment.TickCount;
Thread.Sleep(1);
var t2 = Environment.TickCount;
Console.WriteLn(t2 - t1);
TimeEndPeriod(1);
我预期的是 1 或 2,但实际上我得到了 15 或 16。
有没有我遗漏的代码?
【问题讨论】:
-
您是否尝试了相同的没有
Thread.Sleep?我很好奇t1和t2之间有什么区别 -
来自
Thread.Sleep文档:实际超时可能不完全是指定的超时,因为指定的超时将被调整为与时钟滴答相吻合 -
你永远不会得到预期的 1 或 2 毫秒,因为执行 Thread.Sleep 的时间最少为 4 或 5 毫秒
-
我不知道
Environment.TickCount多久更新一次,是否确实受到设置计时器分辨率的影响,但调用TimeBeginPeriod(1)确实将Sleep()的分辨率更改为(大约)对我来说是 1 毫秒。 -
根据我的个人经验,
Thread.Sleep即使设置TimeBeginPeriod也是完全不可靠的。最好使用Multimedia Timers。
标签: c# windows multithreading