运行以下(略微伪)代码会产生以下结果.我对计时器的真空程度感到震惊(每次增加约14ms Tick).
那里有更准确的东西吗?
void Main()
{
var timer = new System.Threading.Timer(TimerCallback, null, 0, 1000);
}
void TimerCallback(object state)
{
Debug.WriteLine(DateTime.Now.ToString("ss.ffff"));
}
Sample Output:
...
11.9109
12.9190
13.9331
14.9491
15.9632
16.9752
17.9893
19.0043
20.0164
21.0305
22.0445
23.0586
24.0726
25.0867
26.1008
27.1148
28.1289
29.1429
30.1570
31.1710
32.1851
Run Code Online (Sandbox Code Playgroud) 前段时间我在Raspberry Pi 3上构建了一个应用程序.其中,它使用步进电机驱动板控制步进电机.为了让电机向"步进"移动,我必须将输出引脚设置为高电平和低电平.电压的变化会导致电机进入下一个位置.我需要在电压变化之间有一个小的时间延迟才能正常工作.
我最初的研究表明,在UWP应用程序中获得时间延迟的最佳实践方法是使用异步Task.Delay()方法.我无法访问UWP中的Thread.Sleep方法,所以我试了一下.此外,由于该方法采用整数作为参数,因此1毫秒是我可以使用的最短延迟.
这是我第一次尝试的例子,制作了1600个连续的"步骤":
for (int i = 0; i < 1600; i++)
{
// (stepper driver board makes one step for every low-to-high transition)
StepperStepPin.Write(GpioPinValue.Low);
await Task.Delay(1); // wait 1 ms
StepperStepPin.Write(GpioPinValue.High);
await Task.Delay(1); // wait 1 ms
}
Run Code Online (Sandbox Code Playgroud)
理论上,在循环的每次迭代中延迟2ms,这应该花费大约3.2秒.实际上,它最终需要大约51秒.据我所知,调用此异步延迟方法的行为会增加大约15 ms的开销来启动异步线程.如果我只是偶尔使用更长的延迟,这将是不明显的.但是,当我不得不做成百次或数千次时,它会迅速增加.
经过多次挖掘,我发现了一个适合我的解决方案.我放弃了异步方法并使用System.Diagnostics.Stopwatch类进行同步方法,它也让我有亚毫秒延迟:
private readonly Stopwatch _sw = new System.Diagnostics.Stopwatch();
private void ShortDelay(double milliseconds) {
_sw.Start();
while ((_sw.Elapsed).TotalMilliseconds < milliseconds) { }
_sw.Reset();
}
//////////////////////////////////////////
for (int i = 0; i < 1600; i++)
{ …Run Code Online (Sandbox Code Playgroud) 当我使用Emgu播放视频时,它的播放速度比应该的速度快.这是相关的代码.
public Form1()
{
InitializeComponent();
_capture = new Capture("test.avi");
Application.Idle += RefreshFrames;
}
protected void RefreshFrames(object sender, EventArgs e)
{
imageBox.Image = _capture.QueryFrame();
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用Capture对象上的SetCaptureProperty方法设置FPS,但它仍然以超快速运动方式播放.
给定一个时间戳字符串来自另一台机器A到机器B(例如hh:mm:ss.fff),并假设两台机器的时钟同步,我怎样才能让机器B计算其时钟与来自机器A的字符串中的时间之间的时间跨度?
我试过比较DateTime.Now.Ticks,但分辨率似乎是10-20毫秒.我想计算更接近1毫秒的分辨率.
一段时间以来,我已经成功地Stopwatch.GetTimestamp()用于高分辨率计时,但请记住它不是那么简单,因为我只有机器B中可用的字符串,并且没有很好的方法来校准Stopwatch.GetTimestamp实际的系统时间.
是否存在高分辨率计时器,每次计时器过去时都会引发事件,就像System.Timer课程一样?Elapse每隔ms 我需要一个高分辨率计时器.
我一直在发帖说明秒表可以测量高分辨率,但我不想测量时间,我想创建一个1毫秒的间隔.
在.NET中有什么东西,还是我要编写自己的高分辨率计时器?