在c#中高速切换位
本文关键字:换位 高速切 | 更新日期: 2023-09-27 18:02:32
我想在时间短于1毫秒的情况下切换位。我更喜欢在c# Windows窗体中这样做,但它可以在例如c++, c#的控制台应用程序中使用。我想做的是切换位并通过LPT端口发送它。
这个代码中的切换位是慢的…
PortAccess.Output(888,1);
Thread.Sleep(1);
PortAccess.Output(888,0);
Thread.Sleep(1);
我读过这篇文章:如何使用QueryPerformanceCounter?,但这只是计时器…
请帮忙:)
在c#/中没有简单或明显的方法来实现这种细粒度的定时控制。网络环境。您可以使用Stopwatch
类来接近它,但是分辨率对于实时工作来说不是很好。要使用计时器来做类似这样的事情——代码是无意义的,但是要循环,直到所经过的时间是您想要的间隔:
Stopwatch swatch = new Stopwatch();
while(true)
{
swatch.Reset();
swatch.Start();
PortAccess.Output(888, 1);
while (swatch.ElapsedMilliseconds < 1) { }
swatch.Stop();
swatch.Reset();
swatch.Start();
PortAccess.Output(888, 0);
while (swatch.ElapsedMilliseconds < 1) { }
swatch.Stop();
}
Sleep
不应用于任何地方的计时。Sleep
基本上只是说,"睡眠至少X毫秒"。所以Sleep(1)
可能会休眠25ms。
顺便说一句:几乎没有个人电脑有并行端口了。这是一种古老的——不,是最古老的将比特或翻转输出输出到PC外部的方式。通过直接输出到PC IO端口来完成它也真的是垃圾。你可以找一个外部的数字IO设备/板/接口与一个像样的驱动程序-更好的主意。
首先,您必须意识到Sleep()
没有这么好的分辨率。通常分辨率是20ms左右,所以你的通话等待的时间会比你想要的长得多。
第二,在像Windows这样不提供实时保证的系统中,即使你保持线程存活(例如使用Spinwait()
),你也不能指望每毫秒都能实际执行一些事情。在正常的任务切换过程中,线程可能仍然会被操作系统中断,因此您将有长达几毫秒的无活动时间。
总之,不要那样做。
记住Lucero和Kieren,我仍然会回答你的问题。
您可以使用秒表获得亚毫秒精度使用Ticks其中1 Tick== 1/10,000毫秒。例如这里等待1/10毫秒:
Stopwatch sw = Stopwatch.StartNew();
while (sw.ElapsedTicks <1000);
Debug.Print(sw.ElapsedTicks.ToString());
你应该确保秒表在你将要使用的系统上有足够高的频率。另外,请记住,这里您不是在驱动程序级别,因此没有任何接近实时的保证。