#!/usr/bin/perl -w
use strict;
use Config;
use if !$Config{useithreads} => 'Test::More' => skip_all => 'no threads';
use threads;
use threads::shared;
use Wx;
use if !Wx::wxTHREADS(), 'Test::More' => skip_all => 'No thread support';
use if Wx::wxVERSION < 2.006, 'Test::More' => skip_all => 'Hangs under 2.5';
use Test::More tests => 2;
{
package MyFrame;
use base 'Wx::Frame';
}
my $app = Wx::App->new( sub { 1 } );
my $frame = MyFrame->new( undef, -1, 'Test' );
my $timer = Wx::Timer->new( $frame );
my $TEST_DONE_EVENT : shared = Wx::NewEventType;
# avoid use()ing Wx::Event on purpose
Wx::Event::EVT_COMMAND( $frame, -1, $TEST_DONE_EVENT, \&got_thread_event );
Wx::Event::EVT_TIMER( $frame, -1, \&got_timer_event );
$timer->Start( 800, 1 );
$app->MainLoop;
pass; # ended successfully
sub got_timer_event {
my( $frame, $event ) = @_; @_ = (); # hack to avoid "Scalars leaked"
start_thread( $frame );
}
sub start_thread {
my( $frame ) = @_;
my $thread = threads->new( \&send_thread_event, $frame );
$thread->join;
}
sub send_thread_event {
my( $frame ) = @_;
my $threvent = new Wx::PlThreadEvent( -1, $TEST_DONE_EVENT, 123 );
Wx::PostEvent( $frame, $threvent );
}
sub got_thread_event {
pass;
$frame->Destroy;
}