在连续的输入调用之间丢弃键盘事件(MATLAB)

时间:2016-01-04 14:17:23

标签: matlab user-input keyboard-events user-interaction

我的代码包含以下重复模式:

  1. 要求用户按开始计算(使用input)。
  2. 执行一些冗长的计算并向用户显示一些信息。
  3. 等待用户再次按继续进行进一步的计算。
  4. 我面临的问题:如果用户在出现1 st 提示后多次按下Return / Enter / (推测)错误地),这些按下的提示被以下提示拦截,导致其余的代码执行。

    期望的行为:我想在接受提示之后和下一个提示之前丢弃任意数量的键盘事件,这样如果没有明确的用户与每个提示符的交互,计算就不会进行。

    重现问题的代码:

    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 ---');
    

    说明:在1 st 提示下按“Enter”一次,或注释掉robot.keyPressrobot.keyRelease并按两次(或更多)。

1 个答案:

答案 0 :(得分:3)

使用计时器检查在下一个提示的出现与“注册按钮按下”之间经过了一些最小时间,允许确定按压是否可被视为有效。因此,使用以下循环围绕2 nd 提示似乎可以解决此问题:

%% // 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