Как мое приложение WxPerl может игнорировать нажатия клавиш во время выполнения метода? - PullRequest
2 голосов
/ 07 августа 2009

У меня есть приложение, которое ждет, пока пользователь нажмет клавишу, а затем выполняет долгосрочный метод, который периодически обновляет графический интерфейс.

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

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

Я бы хотел, чтобы приложение игнорировало любые нажатия клавиш, возникающие во время выполнения метода doStuff.

Я попытался установить флаг и обернуть вызов метода дополнительным оператором if, но метод kepress не вводится, пока doStuff не завершится.

Я новичок в wxwidgets и чувствую, что не знаю, чего не знаю. Будем весьма благодарны за любые предложения о том, что исследовать дальше.

Ответы [ 2 ]

4 голосов
/ 07 августа 2009

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

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

Вы, вероятно, действительно хотите вместо этого показать индикатор выполнения, или возможно, отключить только одно действие. Никто не хочет, чтобы их графический интерфейс заморозить и не предоставлять никаких отзывов!

1 голос
/ 07 августа 2009

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

...