在C#中暂停线程以获得比线程更精确的时间。睡眠-什么是最好的方法?
我有这个密码:在C#中暂停线程以获得比线程更精确的时间。睡眠-什么是最好的方法?,c#,sleep,pause,C#,Sleep,Pause,我有这个密码: while(MouseKeyboardStateTest.Keyboard.IsKeyDown(Keys.Space)) { Keyboard.KeyPress(Keys.A); Thread.Sleep(asChecker.currentDelay); for (int i = 0; i <= asChecker.currentMouseClicks; i++) { Mouse.PressButton(Mouse.Mouse
while(MouseKeyboardStateTest.Keyboard.IsKeyDown(Keys.Space))
{
Keyboard.KeyPress(Keys.A);
Thread.Sleep(asChecker.currentDelay);
for (int i = 0; i <= asChecker.currentMouseClicks; i++)
{
Mouse.PressButton(Mouse.MouseKeys.Right);
Thread.Sleep(globalMouseDelay);
}
}
while(MouseKeyboardStateTest.Keyboard.IsKeyDown(Keys.Space))
{
键盘。按键(A键);
线程睡眠(asChecker.currentDelay);
对于(inti=0;i不使用Thread.Sleep
)
将表单的KeyPreview
设置为true
,并使用表单的键事件
这将允许您在没有延迟的情况下获得关键事件的通知,并且不会出现冻结UI的循环
另请参见
您也可以使用游戏API。这些API允许您对鼠标和按键事件做出快速反应,而不受控件的限制。它们还允许您检测同时按下的按键
由于您不是在UI中执行此操作(根据您的评论),因此我建议采用不同的方法:
在游戏中,您通常使用一个游戏循环,该循环尽可能快地循环,没有任何线程。睡眠延迟。在每个循环中,您检查输入的当前状态(键盘、鼠标、操纵杆),并相应地更新游戏状态和显示
在每个循环中,使用DateTime.UtcNow
(比DateTime.Now
快)保存当前时间,并检查发生操作后经过的时间,以了解是否已达到所需的延迟
如果DateTime
不够准确,请使用StopWatch
类。请参阅:。它与需要的准确度完全相同。操作系统线程调度程序只查找准备在“心跳”时运行的线程,时钟滴答声中断。它通常每秒滴答声64次。当您打开浏览器时,它的滴答声往往为100次。您不能假设您的线程在睡眠时间到期时实际获得处理器,它还必须与其他需要服务的线程竞争。使用thread.Priority可能有助于获得不公平的份额。要获得g保证它将是10毫秒,而不是15.625秒。您需要pinvoke timeBeginPeriod()。我没有使用任何UI,延迟是因为它在游戏中执行操作,需要一定的延迟。由于您重新打开并回答了问题,请用更好的标题编辑问题。现在,出现此问题的人可能会遇到与您在此处回答的问题完全不同的问题。