The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/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;
}