2

ユーザーがキーを押すのを待ってから、定期的に 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 に慣れていないので、何がわからないのかわかりません。次に何を探索するかについての提案は大歓迎です。

4

2 に答える 2

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

ただし、代わりにプログレスバーを表示したい場合や、1つのアクションのみを無効にしたい場合があります。GUIがフリーズしてフィードバックを提供しないことを誰も望んでいません!

于 2009-08-07T04:24:04.483 に答える
1

メソッドがまだ実行されていないときにのみメソッドが実行されるように、ある種のグローバルまたはシングルトンを使用します。その後、後続のキーストロークで終了します。

于 2009-08-07T16:20:34.973 に答える