是否有替换timeBeginPeriod和timeEndPeriod方法的.NET?

时间:2012-11-05 14:44:33

标签: .net serial-port delphi-prism oxygene winmm

我一直致力于在SerialPort上进行通信并且遇到问题的程序。它的通信低于50%或更低。如果没有,它大部分时间都会超时。

根据我对此问题的研究,我发现默认情况下全局或系统计时器分辨率至少为10毫秒或更长。

Serial Communication (RTS) and Windows 7

因此,如果您在通信中使用Thread.Sleep暂停X毫秒,那么对于无操作或暂停,它可以做的最好是10ms或更长。

就我而言,我的程序与外部设备通信的时间太长。一旦收到我的程序请求,设备会在10ms内回复。如果我的程序还没有准备好收到回复,那么我的程序将会超时。

解决此问题的唯一方法是调整或更改系统计时器分辨率。为此,我被告知要使用winmm.dll中的Windows方法timeBeginPeriod和timeEndPeriod。虽然我能够为我的程序的Windows .NET版本导入这些方法,但我想知道.NET框架中是否有替代这些方法。

1 个答案:

答案 0 :(得分:2)

如果您的目标是避免调用特定于平台的DLL函数,并且只是使用.Net框架,那么对于短暂的超时,使用System.Diagnostics.Stopwatch的循环可能是您最好的选择。

秒表会在出现时自动使用高分辨率计时器。

public static void Pause(long ms) 
{
    Stopwatch t = new Stopwatch();
    t.Start();
    while(t.ElapsedMilliseconds < ms) { }
    t.Stop();
}

这会在暂停循环中阻塞你的调用线程并占用CPU,以减轻其中的一部分(如果你使用的是多核系统,你可以设置你的进程或线程与另一个核心的亲和力。{{3} }