相关疑难解决方法(0)

.NET中最准确的计时器?

运行以下(略微伪)代码会产生以下结果.我对计时器的真空程度感到震惊(每次增加约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)

c# timer

30
推荐指数
5
解决办法
4万
查看次数

UWP应用程序中的Async Task.Delay开销是否有更好的解决方案?

前段时间我在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)

c# async-await raspberry-pi windows-10-iot-core uwp

7
推荐指数
1
解决办法
828
查看次数

Emgu Capture以超快的速度播放视频

当我使用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,但它仍然以超快速运动方式播放.

emgucv

6
推荐指数
1
解决办法
1万
查看次数

从DateTime.Now获取高分辨率时间戳

给定一个时间戳字符串来自另一台机器A到机器B(例如hh:mm:ss.fff),并假设两台机器的时钟同步,我怎样才能让机器B计算其时钟与来自机器A的字符串中的时间之间的时间跨度?

我试过比较DateTime.Now.Ticks,但分辨率似乎是10-20毫秒.我想计算更接近1毫秒的分辨率.

一段时间以来,我已经成功地Stopwatch.GetTimestamp()用于高分辨率计时,但请记住它不是那么简单,因为我只有机器B中可用的字符串,并且没有很好的方法来校准Stopwatch.GetTimestamp实际的系统时间.

.net c# datetime

5
推荐指数
1
解决办法
1668
查看次数

C#中的高分辨率计时器

是否存在高分辨率计时器,每次计时器过去时都会引发事件,就像System.Timer课程一样?Elapse每隔ms 我需要一个高分辨率计时器.

我一直在发帖说明秒表可以测量高分辨率,但我不想测量时间,我想创建一个1毫秒的间隔.

在.NET中有什么东西,还是我要编写自己的高分辨率计时器?

c# timer high-resolution

5
推荐指数
1
解决办法
1万
查看次数