1

私はこのようなプログラムを持っています

...
$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()ループを中断できるようにすることです。

適切なコードを作成するにはどうすればよいですか?

4

2 に答える 2

0

wxTimer を試して、on_click_start 関数で開始してください。長時間の操作コードをタイマーのイベントの下に置きます (繰り返しトリガーしないように注意し、そこでタイマーも停止してください)。長い操作関数​​内で、グローバル変数を使用して、キャンセルするかどうかを確認します。ボタンが発生した場合、グローバル変数の値を変更して、長期的なコードがそれを認識し、ループをキャンセル/中断します。

タイマーのイベントでのループが UI をハングさせるかどうかはわかりませんが、スレッドを使用しているように見えるので、そうはならないかもしれません。とにかく試してみてください。そのようなものが必要なときは常にwxTimerを使用します(UIをぶら下げたり、スレッドを直接使用したりしないでください)。

于 2014-10-31T07:53:39.103 に答える