2015-07-03 208 views
-2
while (TOGGLE == false) { 

      if (Keyboard.IsKeyDown(Key.A)) { RESULT = RESULT + "A";} 
      if (Keyboard.IsKeyDown(Key.B)) { RESULT = RESULT + "B"; MessageBox.Show(RESULT); } 
      if (Keyboard.IsKeyDown(Key.C)) { RESULT = RESULT + "C"; MessageBox.Show(RESULT); } 
    } 

好吧,所以當我點擊B或C鍵時,一切正常,它將字添加到字符串變量RESULT,但是當我點擊A時,它將添加無限量的A到結果字符串。我究竟做錯了什麼?c#雖然循環問題

編輯: 我知道我沒有設置TOGGLE爲false。但這是重點!我會更好地解釋:這個應用程序將在後臺運行。所以當客戶端在記事本中寫入時,這個程序會檢測到他按下的每個鍵,並將它添加到RESULT字符串中。我不希望這個while循環在按下按鍵時立即停止。我希望它循環直到客戶端完成在記事本中寫入(這是當我將TOGGLE設置爲false)。

+1

您不會在代碼中的任何位置更改TOGGLE值,即使按'B',它也會在顯示消息框後繼續*無限*。 – Habib

+1

你什麼時候改變TOGGLE? –

+0

這就是所謂的無限循環。由於在按'b'或'c'時彈出'MessageBox',只有一個字符被添加到消息後,它會顯示'RESULT'。當按下'a'時,只要按鍵關閉,就會重複添加一個'A'。 –

回答

0

因爲當消息框出現時阻止了循環,但對於A沒有消息框來阻止ui線程在循環中繼續,而A鍵仍然按下。

您需要

break; 

圈外你追加的字符串後,或顯示一個消息框,這取決於你想要達到的目標。

0

當您顯示一個消息框時,它將停止while循環繼續,因爲對消息框的調用是阻塞調用。這意味着代碼在消息框關閉之前不會繼續執行。

在您的示例中,當您按下A時,消息框未顯示,所以循環繼續。要解決此問題,您必須將Toggle設置爲true。

while (TOGGLE == false) 
{ 
    if (Keyboard.IsKeyDown(Key.A)) 
    { 
     RESULT = RESULT + "A"; 
     TOGGLE = true; 
    } 
    if (Keyboard.IsKeyDown(Key.B)) 
    { 
     RESULT = RESULT + "B"; 
     MessageBox.Show(RESULT); 
     TOGGLE = true; 
    } 
    if (Keyboard.IsKeyDown(Key.C)) 
    { 
     RESULT = RESULT + "C"; 
     MessageBox.Show(RESULT); 
     TOGGLE = true; 
    } 
} 
0

你的環路會非常快。按下「A」鍵一秒鐘意味着將按下幾千個循環。添加一個System.Threading.Thread.Sleep(100);將掛起一點循環。

也許這可以幫助你實現你想要什麼:

while (TOGGLE == false) 
{ 
    if (Keyboard.IsKeyDown(Key.A)) { RESULT = RESULT + "A"; System.Threading.Thread.Sleep(100); } 
    if (Keyboard.IsKeyDown(Key.B)) { RESULT = RESULT + "B"; MessageBox.Show(RESULT); } 
    if (Keyboard.IsKeyDown(Key.C)) { RESULT = RESULT + "C"; MessageBox.Show(RESULT); } 
} 

另一種解決方案沒有了Thread.Sleep

DateTime lastAletter = DateTime.Now; 
while (TOGGLE == false) 
{ 
    if (Keyboard.IsKeyDown(Key.A) && lastAletter.AddMilliseconds(100) < DateTime.Now) { RESULT = RESULT + "A"; lastAletter = DateTime.Now; } 
    if (Keyboard.IsKeyDown(Key.B)) { RESULT = RESULT + "B"; MessageBox.Show(RESULT); } 
    if (Keyboard.IsKeyDown(Key.C)) { RESULT = RESULT + "C"; MessageBox.Show(RESULT); } 
} 

使用KeyPress event將是一個很大更有效率,並且記住while(true)是處理器飢餓

+0

是的,我也想到了,但沒有使用睡眠有點bug(在這種情況下)? – misticone

+0

你需要考慮的是,在睡覺時沒有東西會被「註冊」,但是對這種東西使用循環是一個小處理器餓...你應該嘗試註冊一個KeyPress事件或類似的東西。 – Guish

+0

在這裏,我編輯了我的答案,刪除睡眠部分 – Guish

0

我知道我沒有設置TOGGLE爲false。但這是重點!我會更好地解釋:這個應用程序將在後臺運行。所以當客戶端在記事本中寫入時,這個程序會檢測到他按下的每個鍵,並將它添加到RESULT字符串中。我不希望這個while循環在按下按鍵時立即停止。我希望它循環直到客戶端完成在記事本中寫入(這是當我將TOGGLE設置爲false)。