我想切换时间短于1 ms的位。我更喜欢在C#Windows窗体中执行此操作,但它可以在例如C ++,C#中的控制台应用程序中。我想要做的是切换位并通过LPT端口发送它。
此代码中的切换位慢...
PortAccess.Output(888,1);
Thread.Sleep(1);
PortAccess.Output(888,0);
Thread.Sleep(1);
我读过这篇文章:How to use QueryPerformanceCounter?,但它只是计时器..
请帮助:)
答案 0 :(得分:3)
在C#/ .NET环境中,没有简单或明显的方法可以进行这种细粒度的时序控制。您可以使用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)
可能会睡25分钟。
顺便说一句:旁边没有PC就有并行端口了。这是一种古老的 - 不是最古老的在PC外部写入位或翻转输出的方法。通过直接输出到PC IO端口来实现它也是非常垃圾。您可以寻找具有合适驱动程序的外部数字IO设备/电路板/接口 - 更好的主意。
答案 1 :(得分:1)
首先,你必须要知道Sleep()
没有这么好的分辨率。通常它的分辨率大约为20ms,因此您的呼叫将等待比您想要的更长的时间。
其次,在像Windows这样没有提供实时保修的系统中,即使你保持线程活着(例如使用Spinwait()
),你也不能依赖于每毫秒实际执行一些事情。在正常任务切换过程中,操作系统可能并且仍然会中断该线程,因此您将有几天没有活动的时间。
简而言之,不要试试。它不起作用。
答案 2 :(得分:1)
记住Lucero和Kieren,我仍然会回答你的问题。
使用Ticks = 1 / 10,000毫秒的Ticks,您可以使用秒表获得亚毫秒精度。例如,这里等待1/10毫秒:
Stopwatch sw = Stopwatch.StartNew();
while (sw.ElapsedTicks <1000);
Debug.Print(sw.ElapsedTicks.ToString());
您应该确保秒表具有足够高的frequency,以满足您将要使用它的系统的需求。另外,请记住,你不是在这里的驾驶员级别,所以没有任何接近实时保证。