From: Mattia B. <mb...@ds...> - 2001-11-28 22:43:01
|
> > > Hey guys, > > > I've been seaching through the doc's for a way to fire off Events > > even if I'm running a loop such as... > > > > > > foreach my $i (0..999999) {...} > > > > > > I've found the Yield() and SafeYield() functions. But those only > > allow the GUI to be updated for interaction, but don't allow the > > functions tied to the events to be called. At least, as far as I can > > tell anyhow. Anyone have any advice? > > The only "real" solution to your problem is to use threads; as an > > I was afraid of that. :( Are threads available in wxPerl? All I *really* > need to do is toggle a variable by pressing a button to make the loop stop. No, but Perl threads might just work, if you don't call GUI functions from them ( but I _never_ tried ) OTOH, you don't need threads for just a 'stop me' button. I modified the minimal sample like this: ------- sub OnAbout { my( $this, $event ) = @_; MyDialog->new( $this, -1, "AAA" ); foreach ( 1 .. 100000 ) { sleep 1;Wx::Yield(); } # display a simple about box Wx::MessageBox( "This is the about dialog of minimal sample.\n" . "Welcome to wxPerl " . $Wx::VERSION . "\n" . wxVERSION_STRING, "About minimal", wxOK | wxICON_INFORMATION, $this ); } package MyDialog; use vars qw(@ISA); @ISA = qw(Wx::Dialog); use Wx::Event qw(EVT_BUTTON); use Wx qw(wxOK wxICON_INFORMATION wxVERSION_STRING); sub new { my $class = shift; my $this = $class->SUPER::new( @_ ); my $button = Wx::Button->new( $this, -1, "Click" ); EVT_BUTTON( $this, $button, \&Foo ); $this->Show( 1 ); return $this; } sub Foo { Wx::MessageBox( "AA", "BB", wxOK, $_[0] ); } ------ And clicking on the button shows a dialog, just does so once every second, though, so if every iteration of the loop takes, say, 20 seconds, you will be able to stop the calculation just once every 20 seconds > > ( ugly ) workaround you might use a wxTimer; using wxYield is _strongly_ > > discouraged because it can lead to unexpected reentrancy > > problems ( of course there are cases where you can't do without ). > > I never used it, so I can't tell if the handlers not being fired is > > a wxPerl or a wxWindows problem ( will check ). Regards Mattia |