Как мое приложение WxPerl может игнорировать нажатия клавиш во время выполнения метода?

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

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

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

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

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

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


person pdemarest    schedule 07.08.2009    source источник


Ответы (2)


Я не уверен, что это лучший способ игнорировать события в среде 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);
    }
}

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

person jrockway    schedule 07.08.2009

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

person Robert Swisher    schedule 07.08.2009