【问题标题】:Putting a thread to sleep for decimal value让线程休眠以获取十进制值
【发布时间】:2013-05-19 17:42:16
【问题描述】:

这个问题是关于System.Threading.Thread.Sleep(int)。我知道没有十进制值的方法,但我确实需要使用小数。

我有一个设备需要 20.37 毫秒才能转动 1 度。所以,我需要让代码休眠以适当乘以 20.37(2 度 = 20.37*2 等)。由于线程类没有十进制睡眠方法,我该怎么做?

【问题讨论】:

  • Thread.Sleep() 只保证睡眠 至少 毫秒数,这意味着您可以请求 20 毫秒,也可以在线程重新启动之前以 800 毫秒结束.如果您想要实时,该 API 可能不适合您。
  • 您的设备 API 是否提供任何通知,例如OnTurned
  • 你为什么需要它那么准确?
  • @newStackExchangeInstance:您好,系统是一个高度关键系统的模块:)
  • @Knight 你确定驱动程序没有 API 可以让设备自己处理时间吗?即使您使用 C++ 进行本机编码,我也看不到任何方法可以保证用户空间接近微秒级的精度。

标签: c# .net multithreading visual-studio-2010 decimal


【解决方案1】:

那样不行。 Sleep 将授予您该线程闲置 x 时间,但不是说它不会闲置更长时间。休眠期结束意味着线程可供调度程序运行,但调度程序可能会选择在该时刻运行其他线程/进程。

获取初始时刻,找到最终时刻,并通过经过的时间计算当前回合。另外,不要忘记检查时间函数的精确度。

实时编程有其自身的一些特殊性,建议您在尝试使某些东西正常工作之前寻求有关该主题的更多信息。它可能非常广泛(多处理操作系统与单处理、优先级等)

【讨论】:

  • 时间函数精确到15ms(至少DateTime.Now是...)
  • 请在问题中阅读我的 cmets。你也许可以给我一个更好的答案:)
  • 没有更好的答案。如果您忽略实时编程问题,您将无法安装一个好的实时系统(注意我没有说“程序”)。任何健全的设备都应该为您提供并包含在其硬件中的一组原语以正确处理它(“旋转 x 度”,“旋转 y 度”)。至少,一个最小的反馈(“我当前的位置是”)。如果没有,你就准备好了所有的 RT 血腥(如果用户因为他也在翻录 DVD 而破坏 CPU 会发生什么,并且没有时间处理你的过程?以及所有其他“有趣”的可能性)。
  • 我认为如果他担心 0.37 毫秒,那将是一台专用机器。
  • @newStackExchangeInstance 或病毒,或防病毒,或调度程序切换进程,或碎片整理,或其他任何东西。有人应该检查 Windows 和 C# EULA,并检查他们对实时系统的描述......
【解决方案2】:

没错,正如 cmets 中所指出的,Thread.Sleep 并非 100% 准确。但是,您可以(理论上)通过将毫秒转换为滴答声,然后创建一个新的TimeSpan 并使用它调用方法来等待 20.27 毫秒,如下所示:

Thread.Sleep(new TimeSpan(202700)) 
//202700 is 20.27 * TimeSpan.TicksPerMillisecond (which is 10,000)

同样,这可能不会是 100% 准确的(因为 Thread.Sleep 只能保证至少该时间量)。但如果这足够准确,那就没问题了。

【讨论】:

  • @Knight 正要问这个问题。我充分清楚地表明它并不完美......所以如果不赞成投票的人不仅仅是愤怒的投票者,我想要一个解释!
  • 不是我投反对票...但是...我想指出Thread.Sleep(TimeSpan)的实现只是将TimeSpan.TotalMilliseconds转换为整数值,所以这是不可能的以此获得亚毫秒级的精度。
  • @MatthewWatson 你就在那儿……不幸的是。因此,与仅使用 Thread.Sleep(20) 相比,这毫无用处...
  • 好的,谢谢您的回复。来自我的 +1 :)
【解决方案3】:

您可以简单地将整数相除 - 我刚刚想通了。

我需要的线程睡眠时间不到一毫秒,所以我只是将该时间除以一个整数,您可以定义一个常量或直接输入:

System.Threading.Thread.Sleep(time / 100);

或者你想要什么号码。 或者,如上所述,您可以这样做:

int thisIsTheNumberYouDivideTheTimeBy = 100;
Thread.Sleep(time / thisIsTheNumberYouDivideTheTimeBy);

其实很简单。希望对您有所帮助。

顺便说一句,而不是

System.Threading.Thread.Sleep(x);

你可以输入

Thread.Sleep(x);

除非你没有写

using System.Threading;

一开始。

【讨论】:

    【解决方案4】:

    我遇到了同样的问题。但作为一种解决方法,我替换了 float vslie 但在传递时转换为 int 值。代码本身对我来说是四舍五入,线程休眠了那么长时间。正如我所说,它是一种解决方法,我只是说,并不是说它是准确的

    【讨论】:

      【解决方案5】:

      您可以使用一点数学作为解决方法。 让我们假设,你不想非常精确, 但仍需要整体浮动精确睡眠。

      Thread.Sleep(new Random().Next(20,21)); 这应该给你〜20.5睡眠时间。现在就发挥你的想象力。

      TotalSleeps / Trys =“应该是想要的值”,但对于单个睡眠间隔,这将不是真的。

      之前不要使用 new Random() 创建实例。

      【讨论】:

      • 首先,这个答案是错误的;你认为这个“应该”给你平均时间的结论是不正确的;它是否应该做任何事情都无关紧要;相关的是它做什么 做什么,并且不一定会观察到 Sleep 具有该行为。其次,这个问题需要精确的实时计时;没有使用 Sleep 是适合的。 Windows 不是实时操作系统。第三,请不要浪费您和其他人的时间来发布已被接受的五年前问题的错误答案。
      猜你喜欢
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 2014-05-12
      • 2010-09-10
      • 2011-05-14
      • 2010-12-08
      相关资源
      最近更新 更多