我有这样的程序
...
$self->{bn1}=Wx::Button->new( $tb1, -1, 'Start');
EVT_BUTTON( $self, $self->{bn1}, \&on_click_start );
...
...
sub on_click_start
{
my( $this, $event ) = @_;
$this->{bn1}->SetLabel("Cancel");
$event->Skip;
for (...) {
long_time_operation();
last if ( Cancel_clicked );
}
}
...
我的问题是,当我点击开始按钮时,将会调用 on_click_start(),我想更改开始按钮的标签取消,允许我点击按钮突破 long_time_operation()循环。
如何为其制作正确的代码?
答案 0 :(得分:1)
唯一真正的解决方案是使用多个线程并在后台线程中执行长操作。如果你想保持你的代码简单,你可以使用wxYield()
来处理来自这个事件处理程序的事件,但要注意这可能(并且会)由于重入而导致难以调试的问题,所以在至少你需要禁用其余的UI,如果你这样做的话。
答案 1 :(得分:0)
尝试使用wxTimer并在on_click_start函数中启动它。将长时间操作代码置于定时器事件下(确保它不会重复触发,只需在那里停止定时器)。 在长操作函数中使用一些全局var来知道是否要取消。如果您的按钮现在更改了全局变量的值,那么您的长期代码就会知道这一点,并从循环中取消/中断。
我不确定定时器事件下的循环是否会挂起您的UI,但它似乎使用线程,因此可能不会发生。无论如何尝试它,当我需要这样的东西时,我总是使用wxTimer(不要挂起UI而不直接使用线程)。