在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#中高速切换位

在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());

你应该确保秒表在你将要使用的系统上有足够高的频率。另外,请记住,这里您不是在驱动程序级别,因此没有任何接近实时的保证。