Mark,
On 21/05/15 10:50, Mark Dootson wrote:
Every Wx::Timer event or call to an overridden 'Notify' method leaks 1
SV. I don't have a solution but will work on it over the weekend.
Amazing, I just came to the same conclusion, but I have no idea what to
do from here.
I'll have a look too, but in the meantime, here is my sample code that
demonstrates it. I don't used the over-ridden 'Notify' method.
Thanks very much,
Regards
Steve
#! /usr/bin/perl
package main;
use strict;
use warnings;
$main::app = App->new();
$main::app->MainLoop;
package App;
use strict;
use warnings;
use base 'Wx::App';
sub OnInit {
my $frame = Launch->new();
$frame->Show();
}
package Launch;
use strict;
use warnings;
use Wx qw(:everything);
use base qw(Wx::Frame);
use Devel::Leak;
sub new {
my ($class, $parent) = @_;
# Keep variable out of timer scope.
our $handle;
our $i;
our $count_start;
our $count_stop;
my $i_frame = $class->SUPER::new($parent, -1, "Test wxTimer",
wxDefaultPosition, wxDefaultSize);
$i_frame->{panel} = Wx::Panel->new($i_frame, -1, wxDefaultPosition,
wxDefaultSize);
$i_frame->{sizer} = Wx::BoxSizer->new(wxVERTICAL);
# Start and stop buttons.
$i_frame->{button_start} = Wx::Button->new($i_frame->{panel}, -1,
"Start", wxDefaultPosition, wxDefaultSize);
$i_frame->{sizer}->Add($i_frame->{button_start});
Wx::Event::EVT_BUTTON( $i_frame, $i_frame->{button_start}, sub {
my ($self1, $event1) = @_;
$i=0;
$count_start=Devel::Leak::NoteSV($Launch::handle);
print "Handle start: ", $count_start,"\n";
$self1->{timer} -> Start();
});
$i_frame->{button_stop} = Wx::Button->new($i_frame->{panel}, -1,
"Stop", wxDefaultPosition, wxDefaultSize);
$i_frame->{sizer}->Add($i_frame->{button_stop});
Wx::Event::EVT_BUTTON( $i_frame, $i_frame->{button_stop}, sub {
my ($self1, $event1) = @_;
$self1->{timer} -> Stop();
$count_stop=Devel::Leak::CheckSV($Launch::handle);
print "Handle stop: ", $count_stop,"\n";
print "Count difference: ", $count_stop-$count_start,"\n";
print "Loops: ", $i,"\n";
});
$i_frame->{panel}->SetSizer($i_frame->{sizer});
$i_frame->{panel}->Layout();
# Just do this 100 times to make sure there is no contribution to
$handle count from Devel::Leak
for (1..100){
print "Handle init: ", Devel::Leak::NoteSV($Launch::handle),"\n";
}
$i_frame->{timer} = Wx::Timer->new( $i_frame, -1 );
$i_frame->{timer} -> Start( 100, wxTIMER_CONTINUOUS ); # 600000
Wx::Event::EVT_TIMER( $i_frame, $i_frame->{timer}, \&timer );
return $i_frame;
}
# Don't do anything.
sub timer {
++$Launch::i; # You can comment this out. It makes no difference.
return;
}