C# C语言中的高速开关位# 我想用比1毫秒短的时间来转换位。我更喜欢用C窗口形式来做这个,但是它可以在C++中的控制台应用程序中使用。我要做的是切换位并通过LPT端口发送它

C# C语言中的高速开关位# 我想用比1毫秒短的时间来转换位。我更喜欢用C窗口形式来做这个,但是它可以在C++中的控制台应用程序中使用。我要做的是切换位并通过LPT端口发送它,c#,winapi,bit,lpt,C#,Winapi,Bit,Lpt,此代码中的切换位将变慢 PortAccess.Output(888,1); Thread.Sleep(1); PortAccess.Output(888,0); Thread.Sleep(1); 我读过这篇文章,但它只是计时器 请帮助:)在C#/.NET环境中,没有简单或明显的方法来进行这种细粒度的定时控制。您可以使用秒表类来接近,但是分辨率对于实时工作来说不是很好。要使用计时器执行类似操作-无意义的代码,但要循环直到经过的时间是您所需的时间间隔: Stopwatch swatch = new

此代码中的切换位将变慢

PortAccess.Output(888,1);
Thread.Sleep(1);
PortAccess.Output(888,0);
Thread.Sleep(1);
我读过这篇文章,但它只是计时器


请帮助:)

在C#/.NET环境中,没有简单或明显的方法来进行这种细粒度的定时控制。您可以使用
秒表
类来接近,但是分辨率对于实时工作来说不是很好。要使用计时器执行类似操作-无意义的代码,但要循环直到经过的时间是您所需的时间间隔:

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();
}
Stopwatch样例=新秒表();
while(true)
{
swatch.Reset();
swatch.Start();
输出(888,1);
而(swatch.elapsedmillesons<1){}
swatch.Stop();
swatch.Reset();
swatch.Start();
PortAccess.Output(888,0);
而(swatch.elapsedmillesons<1){}
swatch.Stop();
}
睡眠
不应用于任何地方的计时<代码>睡眠基本上只说“睡眠至少X毫秒”。所以
Sleep(1)
可能会睡25毫秒


顺便说一句:几乎没有PC机有并行端口了。这是一种古老的——不,是最古老的在PC外部写入位或翻转输出的方法。直接输出到PC IO端口也是一种垃圾。你可以寻找一个外部数字IO设备/板/接口,它有一个像样的驱动程序——这是一个更好的主意。

在C#/.NET环境中,没有简单或明显的方法来进行这种细粒度的定时控制。您可以使用
秒表
类来接近,但是分辨率对于实时工作来说不是很好。要使用计时器执行类似操作-无意义的代码,但要循环直到经过的时间是您所需的时间间隔:

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();
}
Stopwatch样例=新秒表();
while(true)
{
swatch.Reset();
swatch.Start();
输出(888,1);
而(swatch.elapsedmillesons<1){}
swatch.Stop();
swatch.Reset();
swatch.Start();
PortAccess.Output(888,0);
而(swatch.elapsedmillesons<1){}
swatch.Stop();
}
睡眠
不应用于任何地方的计时<代码>睡眠基本上只说“睡眠至少X毫秒”。所以
Sleep(1)
可能会睡25毫秒


顺便说一句:几乎没有PC机有并行端口了。这是一种古老的——不,是最古老的在PC外部写入位或翻转输出的方法。直接输出到PC IO端口也是一种垃圾。你可以找一个外置的数字IO设备/板/接口,它有一个像样的驱动程序,这是一个更好的主意。

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

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


简言之,不要这样做。它不会工作。

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

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


简言之,不要这样做。这是行不通的。

记住,卢塞罗和基伦所说的,我仍然会回答你的问题

您可以使用秒表使用滴答来获得亚毫秒精度,其中1滴答==1/10000毫秒。例如,此处等待1/10毫秒:

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

尽管(sw.ElapsedTicks记住Lucero和Kieren所说的,我仍然会回答你的问题

您可以使用秒表使用滴答来获得亚毫秒精度,其中1滴答==1/10000毫秒。例如,此处等待1/10毫秒:

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

虽然(sw.ElapsedTicks我不太确定您想要实现什么,但是应该快速的代码中的
Sleep
看起来不太聪明;-)我不太确定您想要实现什么,但是应该快速的代码中的
Sleep
看起来不太聪明;-)我正在使用LPT与外部CNC驱动程序通信。为此,我使用了MACH3软件,它在驱动程序级别工作。我的应用程序不需要非常精确的计时,添加代码后,步进电机的速度可以:)我正在使用LPT与外部CNC驱动程序通信。为此,我使用了MACH3软件,它在驱动程序级别工作。我的应用不需要非常精确的计时,添加代码后,步进电机的速度可以:)