0

This question is about System.Threading.Thread.Sleep(int). I know there is no method for a decimal value, but I really need to work with decimals.

I have a device which takes 20.37 milliseconds to turn by 1 degree. So, I need to put the code to sleep for an appropriate multiplication of 20.37 (2 degrees = 20.37*2 etc). Since the thread class got no decimal sleep method, how can I do this?

4

5 回答 5

3

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

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

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

于 2013-05-19T17:46:14.683 回答
0

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

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

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

于 2013-05-19T17:55:18.407 回答
-1

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

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

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

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

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

它实际上很简单。希望有帮助。

顺便说一句,而不是

System.Threading.Thread.Sleep(x);

你可以输入

Thread.Sleep(x);

除非你没有写

using System.Threading;

在一开始的时候。

于 2020-11-30T14:53:15.310 回答
-2

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

于 2017-03-13T20:59:12.863 回答
-3

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

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

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

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

于 2018-09-25T23:12:28.367 回答