
use threads;
use threads::shared;
use Thread::Queue;
use strict;
use Wx;


package MyApp;

use base 'Wx::App';

sub OnInit {
    my $self = shift;
       
    my $frame = MyFrame->new();

    $frame->Show(1);
    $self->SetTopWindow($frame);
    return 1;
}

package MyFrame;

use base 'Wx::Frame';
use Wx qw(wxTE_MULTILINE wxVERTICAL wxID_DEFAULT);
use Wx::Event qw(EVT_COMMAND EVT_CLOSE EVT_BUTTON);

my $done_event : shared = Wx::NewEventType;

sub new {
    my $class = shift;
    my $self = $class->SUPER::new(undef, -1, "The title");

    $self->{text} = Wx::TextCtrl->new($self, -1, "", [-1,-1], [300, 300], wxTE_MULTILINE);
    $self->{button} = Wx::Button->new($self, wxID_DEFAULT, "&Get Sites");
    
    my $sizer = Wx::BoxSizer->new(wxVERTICAL);
    $sizer->Add($self->{text});
    $sizer->Add($self->{button});
    $self->SetSizer($sizer);

    $self->{text}->AppendText("test\n");

    EVT_COMMAND($self, -1, $done_event, \&done);
    EVT_CLOSE($self, \&on_close);
    EVT_BUTTON($self,$self->{button}, \&on_button ); 
    
    my $sendqueue = Thread::Queue->new();
    
    my $worker = threads->create(\&worker, $self, $sendqueue );
    
    $self->{queue} = $sendqueue;
    $self->{worker} = $worker;

    $self->Fit;

    return $self;
}

sub on_button {
    my ($self, $event) = @_;
    $self->{queue}->enqueue('GO'); 
    
}

sub on_close {
    my ($self, $event) = @_;
    $self->{queue}->enqueue('STOP');
    $self->{worker}->join;
    $event->Skip(1);
}

sub done {
    my ($self, $event) = @_;

    my $text = $event->GetData;
    $self->{text}->AppendText("$text\n");
}


sub worker {
    my($handler, $queue) = @_;
    use LWP::Simple;
    
    while (my $message = $queue->dequeue ) {
    
        return 1 if $message eq 'STOP';

        my @sites = qw(
            http://www.google.com/
            http://www.microsoft.com/
            http://www.yahoo.com/
            http://www.cpan.org/
            http://www.perl.org/
        );

        for(0 .. $#sites) {
            my $page = get($sites[$_]);
            my ($title1) = $page =~ /<title[^>]*>\s*(.+?)<\/title[^>]*>/gsi;
            my $title : shared = $title1;

            print "$title\n";

            my $thread_event = Wx::PlThreadEvent->new(-1, $done_event, $title);
            Wx::PostEvent($handler, $thread_event);
        }
    }
} 

package main;
MyApp->new->MainLoop;

