[英]Pausing the thread in C# for more accurate time than Thread.Sleep - what would be the best approach?
我有以下代碼:
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);
}
}
它工作正常,問題是Thread.Sleep
不准確,並且延遲並不總是相同。 我還有其他方法可以解決此問題,使其至少精確到10ms嗎?
根本不要使用Thread.Sleep
!
將表單的KeyPreview
設置為true
並使用表單的鍵事件。
這將使您能夠及時獲得關鍵事件的通知,而不會出現滯后,也不會循環凍結UI。
另請參見Winforms的 此答案 :首先在Main Form而不是Controls上攔截Mouse事件 。
您也可以改用游戲API。 這些使您可以非常快速地對鼠標和鍵事件做出反應,而不必與控件綁定。 它們還允許您同時檢測按鍵。
由於您不是在用戶界面中執行此操作(根據您的評論),因此我建議使用另一種方法:
在游戲中,通常使用盡可能快地循環的游戲循環,而沒有任何Thread.Sleep
延遲。 在每個循環中,您都要檢查輸入的當前狀態(鍵盤,鼠標,操縱桿),並更新游戲狀態並進行相應顯示。
在每個循環中,使用DateTime.UtcNow
(比DateTime.Now
快)保存當前時間,並檢查自從發生操作以來經過的時間,以了解是否已達到所需的延遲。
如果DateTime
不夠准確,請使用StopWatch
類。 請參閱: DateTime的精度和准確性 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.