1

我想用短于 1 毫秒的时间切换位。我更喜欢在 C# Windows 窗体中执行此操作,但它可以在例如 C++、C# 中的控制台应用程序中。我想要做的是切换位并通过 LPT 端口发送。

此代码中的切换位很慢..

PortAccess.Output(888,1);
Thread.Sleep(1);
PortAccess.Output(888,0);
Thread.Sleep(1);

我读过这篇文章:如何使用 QueryPerformanceCounter?,但它只是计时器..

请帮忙 :)

4

3 回答 3

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 设备/板/接口 - 更好的主意。

于 2011-07-14T08:05:57.590 回答
1

首先,你要知道Sleep()没有这么好的分辨率。通常它的分辨率约为 20 毫秒,因此您的通话等待时间比您想要的要长得多。

Spinwait()其次,在像 Windows 这样不提供实时保证的系统中,即使您保持线程处于活动状态(例如使用),您也不能依赖每毫秒实际执行某些操作。在正常的任务切换过程中,线程可能并且仍然会被操作系统中断,因此您将有长达几毫秒的无活动期。

简而言之,不要那样尝试。不起作用。

于 2011-07-14T08:10:06.917 回答
1

请记住,Lucero 和 Kieren,我仍然会回答您的问题。

您可以使用秒表通过 Ticks 获得亚毫秒精度,其中 1 Tick== 1/10,000 毫秒。例如这里等待 1/10 毫秒:

    Stopwatch sw = Stopwatch.StartNew();
    while (sw.ElapsedTicks <1000);
    Debug.Print(sw.ElapsedTicks.ToString());

You should make sure that Stopwatch has a high enough frequency for your needs on the system you'll be using it. Also, please remember that you are not at the driver level here, so there is nothing approaching real-time guarantees with this.

于 2011-07-14T08:19:15.933 回答