2015-11-04 92 views
0

我試圖捕獲KeyDownKeyUp之間的時間間隔,這兩個事件之間的經過時間對於每個鍵入的字符,我使用Stopwatch.GetTimestamp(),因爲我需要獲取高分辨率時間戳,如下面的編碼所示,並且我想知道這是否是以毫秒爲單位的時間的正確方程:測量keydown和keyup事件之間的時間

int timeStampInMiliseconds = Convert.ToInt32(elapsedTicks * 1000000/Stopwatch.Frequency);獲取以毫秒爲單位的時間。

由於計時結果沒有顯示任何一致性,並且可能會在這兩個事件之間達到5秒,這是不現實的!

public partial class Form1 : Form 
{ 
    long timeStamp; 
    long initialTimeStamp; 


    public Form1() 
    { 

     InitializeComponent(); 
     Stopwatch stopWatch = new Stopwatch(); 
     // Uses the second Core or Processor for the Test 
     // Prevents "Normal" processes from interrupting Threads 
     // Prevents "Normal" Threads 
     initialize(); 

    } 

    public void initialize() 
    { 
     // 
    } 

    public void textBox1_KeyDown(object sender, KeyEventArgs e) 
    { 

     initialTimeStamp = Stopwatch.GetTimestamp(); 
    } 

    public void textBox1_KeyUp(object sender, KeyEventArgs e) 
    { 
     timeStamp = Stopwatch.GetTimestamp(); 

     long elapsedTicks = timeStamp -initialTimeStamp; 

     int timeStampInMiliseconds = Convert.ToInt32(elapsedTicks * 1000000/Stopwatch.Frequency); 
    } 
} 

真的很感謝您的幫助。

+1

請記住,在同一時間按兩個鍵或使用修飾鍵會打破這一點。例如,按住Control鍵,然後按另一個鍵,然後釋放控制權。 – caesay

+0

除了caesay的評論 - 調試使得結果更加有趣,因爲如果您逐步完成代碼,則可能會導致大量延遲事件。 –

+0

@ caesay @Alexei Levenkov:謝謝您的回答,您能否提出解決方案。謝謝 – Zaid

回答

3

更好的方法是使用StopWatch.ElapsedMilliseconds屬性。

textBox1_KeyDown事件處理程序,只需重新啓動秒錶這樣的:

stopWatch.Restart(); 

而在textBox1_KeyUp事件處理程序,讀取ElapsedMilliseconds屬性是這樣的:

long timeStampInMiliseconds = stopWatch.ElapsedMilliseconds; 

您還需要使stopWatch這樣的一個實例變量:

public partial class Form1 : Form 
{ 
    long timeStamp; 
    long initialTimeStamp; 
    Stopwatch stopWatch; 

    public Form1() 
    { 

     InitializeComponent(); 
     stopWatch = new Stopwatch(); 

     .... 

    } 
    .... 
} 
+0

非常感謝你的工作,但時間不一致,而且沒有捕獲所有的時間由於某種原因。請提出任何建議。 – Zaid

+1

你能解釋失敗的場景嗎? –

0

您不需要使用Stopwatch。這是很容易使用獲得時間戳:

long t = DateTime.Now.Ticks; 

試試這個:

public void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    initialTimeStamp = DateTime.Now.Ticks; 
} 

public void textBox1_KeyUp(object sender, KeyEventArgs e) 
{ 
    timeStamp = DateTime.Now.Ticks; 

    long elapsedTicks = timeStamp - initialTimeStamp; 

    long timeStampInNanoseconds = elapsedTicks * 100; 
} 

我這樣做是在納秒更準確,但如果你喜歡,你可以轉換成毫秒:

long timeStampInMiliseconds = elapsedTicks/10000;