2015-07-03 2 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 в Строка RESULT. Что я делаю не так?C# While Loop issues

EDIT: Я знаю, что не устанавливаю TOGGLE в false. Но в этом смысл! Я объясню лучше: это приложение будет работать в фоновом режиме. Поэтому, когда клиент записывает в блокнот, эта программа будет обнаруживать каждый отдельный ключ, который он нажал, и добавлять его в строку RESULT. Я не хочу, чтобы этот цикл был остановлен, как только нажата клавиша. Я хочу, чтобы он зацикливался до тех пор, пока клиент не закончил писать в блокноте (это когда я установил TOGGLE в false).

+1

Вы не изменяете значение «TOGGLE» в любом месте вашего кода, даже при нажатии 'B', оно должно продолжаться бесконечно * после отображения окна сообщения. – Habib

+1

Когда вы меняете 'TOGGLE'? –

+0

Это то, что называется бесконечным циклом. Поскольку вы нажимаете 'MessageBox', когда вы нажимаете' b' или 'c', он отображает« 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

Да, я тоже об этом думал, но не использую Сон немного глючит (в данном случае)? – misticone

+0

Вам нужно учитывать, что во время сна ничего не будет «зарегистрировано», но использование цикла для такого рода вещей - это небольшой процессор, голодный ... вы должны попытаться зарегистрироваться на событие KeyPress или что-то в этом роде. – Guish

+0

Здесь я отредактировал свой ответ, чтобы удалить часть сна – Guish

0

Я знаю, что я не устанавливаю TOGGLE в false. Но в этом смысл! Я объясню лучше: это приложение будет работать в фоновом режиме. Поэтому, когда клиент записывает в блокнот, эта программа будет обнаруживать каждый отдельный ключ, который он нажал, и добавлять его в строку RESULT. Я не хочу, чтобы этот цикл был остановлен, как только нажата клавиша. Я хочу, чтобы он зацикливался до тех пор, пока клиент не закончил писать в блокноте (это когда я установил TOGGLE в false).