2016-01-04 9 views
2

У меня есть код, который содержит следующий повторяющийся паттерн:отбрасывая события клавиатуры между последовательными вызовами для ввода (MATLAB)

  1. Ask пользователя нажать начать вычисление (с использованием input).
  2. Выполнение некоторых длительных вычислений и отображение информации пользователю.
  3. Ждите, пока пользователь нажмет еще раз, чтобы перейти к дальнейшим вычислениям.

Проблема я столкнулся:, если пользователь нажимает клавишу Return/Enter более/ чем один раз после того, как появится приглашение на 1 й (предположительно по ошибке), эти прессы перехватываются следующими подсказками который заставляет остальную часть кода выполнять.

Желаемое поведение: Я хотел бы отказаться от любого количества событий клавиатуры происходит после того, как акцепт приглашения и до появления следующего одного, так что вычисление не происходит без явного взаимодействия с пользователем с каждый быстрое решение.


код, который воспроизводит проблему:

function q34593155() 
%% // Init 
    clc; 
    import java.awt.Robot; import java.awt.event.*; robot = Robot; 
%% // 1st prompt: 
    disp('--- Some initial info the user should see ---'); 
    [~] = input('\nPress "Return" to start phase 1.\n','s'); 
    disp('Please wait while computation is running...'); 
    %// Here we simulate an additional press: 
    robot.keyPress(KeyEvent.VK_ENTER); 
    robot.keyRelease(KeyEvent.VK_ENTER); 
    pause(2); 
    disp('--- results of the 1st part ---'); 
%% // 2nd prompt: 
    [~] = input('\nPress "Return" to start phase 2.\n','s'); 
    disp('Please wait while computation is running...'); 
    %//^Should only happen after another explicit press on "Enter"'); 
    pause(2); 
    disp('--- results of the 2nd part ---'); 

Инструкции: либо нажать "Enter" сразу на 1 й строке или закомментируйте robot.keyPress и robot.keyRelease и нажмите два раза (или больше).

+0

Немного по теме, но альтернативой может быть использование диалогового окна. 'message = sprintf ('нажмите ok'); uiwait (MsgBox (сообщение)); '. Мышь-робот не всегда смешная, но в случае, если вы действительно хотите дождаться взаимодействия с пользователем, это приятно. – patrik

+0

@patrik - Как вы сказали, ваша идея решает несколько другую проблему (когда взаимодействие с мышью требуется/возможно). Если пользовательские взаимодействия и обновления статуса кода происходят в отдельном окне, можно было бы иметь цифру с кнопкой «Далее» (например, пользовательский «msgbox») и установить фокус на кнопку, но при этом отключить кнопку, если она не должна быть осязаемым ... Хотя, я действительно не знаю, если так вы можете отказаться от нежелательных событий клавиатуры (когда кнопка снова станет осязаемой) ... Не могли бы вы объяснить, как вы собираетесь использовать робота мыши в этом случае? (нажмите кнопку на клавиатуре нажмите?) –

+0

Я хочу сказать, что робот все еще можно использовать, даже если вы покидаете компьютер или из командной строки с опцией -nosplash. Точно так же нельзя доверять роботу для перемещения мыши (нажать «ОК»). Я не имел в виду столько комментариев с моим комментарием, что это был еще один способ решить проблему взаимодействия с пользователем, сохраняя при этом клавиатуру открытой для ввода. Он был опубликован как комментарий, поскольку он не был ответом на ваш вопрос, но все же может быть полезен для связанных с этим проблем. – patrik

ответ

3

Использование таймера для проверки того, что между появлением следующего приглашения и нажатием «зарегистрированной кнопки» прошло некоторое минимальное время, позволяет определить, может ли пресса считаться действительным. Таким образом, окружающая 2-й запрос со следующей петлей, кажется, решить эту проблему:

%% // 2nd prompt: 
    tic; [~] = input('\nPress "Return" to start phase 2.\n','s'); 
    while toc < 0.002 %// 2ms , value may need adjustment based on the machine. 
    [~] = input('','s'); 
    end 
    disp('Please wait while computation is running...'); 
    // rest of code 
+0

Использует '[~] = input ('', 's');' имеет какое-либо преимущество перед 'input ('', 's');'?Это быстрее? –

+0

@ LuisMendo Я просто не хочу засорять мое рабочее пространство переменной 'ans'. ** РЕДАКТИРОВАТЬ: ** На 2-й мысли я просто увидел, что 'input' не создает переменную' ans', если 'nargout == 0'. Поэтому я предполагаю, что это просто привычка :) –

+0

Это было бы * so * гораздо больше поля для гольфа с 'while toc <0.002 ...';) –

 Смежные вопросы

  • Нет связанных вопросов^_^