【问题标题】:How to cancel a long time operation in WxPerl如何在 WxPerl 中取消长时间操作
【发布时间】:2014-08-29 18:42:26
【问题描述】:

我有一个这样的程序

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

我的问题是当我点击Start按钮时,on_click_start()会被调用,我想改变Start按钮的标签Cancel,允许我单击按钮以中断 long_time_operation() 循环。

我如何为它编写正确的代码?

【问题讨论】:

    标签: perl wxwidgets wxperl


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        • 2012-04-03
        • 1970-01-01
        相关资源
        最近更新 更多