【问题标题】:How can my WxPerl application ignore keypresses while a method runs?我的 WxPerl 应用程序如何在方法运行时忽略按键?
【发布时间】:2010-11-17 13:55:52
【问题描述】:

我有一个应用程序,它等待用户按键,然后执行一个长时间运行的方法,定期更新 GUI。

sub keypress{
  my $self = shift;
  my $event = shift;

  if ($event->GetKeyCode() == WXK_F12){
      $self->doStuff();
  }else{
      $event -> Skip(0);
  }
}

我想让应用程序忽略 doStuff 方法执行此操作时发生的任何按键。

我尝试设置一个标志并将方法调用包装在附加的 if 语句中,但直到 doStuff 完成后才输入kepress方法。

我对 wxwidgets 有点陌生,感觉自己不知道自己不知道什么。任何关于下一步探索的建议将不胜感激。

【问题讨论】:

    标签: perl wxwidgets wxperl


    【解决方案1】:

    我会使用某种全局或单例来确保该方法仅在它尚未运行时运行。然后它将在随后的击键时退出。

    【讨论】:

      【解决方案2】:

      我不确定这是在 WxWidgets 框架中忽略事件的最佳方式(因为您可能真的不想在每次执行操作时都冻结 GUI!),但是设置一个标志应该没问题。只要确保你使用了一个守卫,即使堆栈由于异常而展开,你的标志也不会设置:

      use Guard;
      my $flag;
      
      sub keypress{
          my $self = shift;
          my $event = shift;
      
          if ($event->GetKeyCode() == WXK_F12 && !$flag){
              $flag = 1;
              scope_guard { $flag = 0 };
      
              $self->doStuff();
          }
          else {
              $event->Skip(0);
          }
      }
      

      不过,您可能真的想显示一个进度条,或者 也许只禁用一个动作。没有人希望他们的 GUI 冻结,不提供任何反馈!

      【讨论】:

        猜你喜欢
        • 2016-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-07
        • 1970-01-01
        • 2011-08-07
        • 2019-06-27
        • 2021-01-01
        相关资源
        最近更新 更多