当方法运行时,我的WxPerl应用程序如何忽略按键?

时间:2009-08-07 03:13:09

标签: perl wxwidgets wxperl

我有一个等待用户按键的应用程序,然后执行一个定期更新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很新,觉得我不知道我不知道的。关于下一步探索的任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:4)

我不确定这是忽略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 冻结,不提供任何反馈!

答案 1 :(得分:1)

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