簡體   English   中英

與Thread.Sleep相比,在C#中暫停線程可獲得更准確的時間-最佳方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM