我有一个等待用户按键的应用程序,然后执行一个定期更新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很新,觉得我不知道我不知道的。关于下一步探索的任何建议都将不胜感激。
答案 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)
我会使用某种全局或单例来确保该方法仅在尚未运行时运行。然后它将在随后的击键时退出。