如何在WxPerl中取消长时间操作

时间:2014-07-08 21:21:58

标签: perl wxwidgets wxperl

我有这样的程序

...
$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()循环。

如何为其制作正确的代码?

2 个答案:

答案 0 :(得分:1)

唯一真正的解决方案是使用多个线程并在后台线程中执行长操作。如果你想保持你的代码简单,你可以使用wxYield()来处理来自这个事件处理程序的事件,但要注意这可能(并且会)由于重入而导致难以调试的问题,所以在至少你需要禁用其余的UI,如果你这样做的话。

答案 1 :(得分:0)

尝试使用wxTimer并在on_click_start函数中启动它。将长时间操作代码置于定时器事件下(确保它不会重复触发,只需在那里停止定时器)。 在长操作函数中使用一些全局var来知道是否要取消。如果您的按钮现在更改了全局变量的值,那么您的长期代码就会知道这一点,并从循环中取消/中断。

我不确定定时器事件下的循环是否会挂起您的UI,但它似乎使用线程,因此可能不会发生。无论如何尝试它,当我需要这样的东西时,我总是使用wxTimer(不要挂起UI而不直接使用线程)。