Как я могу создать собственный тип события wxPerl? Отправить хэш в основную ветку?

Мне нужно создать приложение GUI wxWidgets, которое будет содержать некоторые индикаторы выполнения (в будущем), которые будут показывать фактическое состояние фоновых процессов.

У меня есть действительно простое приложение для этого; Единственная проблема заключается в том, как отправить пользовательский объект события из рабочего потока в основной поток.

В приведенном ниже примере показано, как отправить скалярное значение в основной поток, но мне нужно отправить хэш.

Я предполагаю, что будет необходимо создать свой собственный тип события с моим собственным классом событий, но как это сделать? Кажется, wxPerl не поддерживает, например, wxEvtHandler::Bind, wxDEFINE_EVENT() или же EVT_CUSTOM(event, id, func) макросы. А может я не прав?

use threads;
use threads::shared;
use Wx;

my $DONE_EVENT;
share($DONE_EVENT);
$DONE_EVENT = Wx::NewEventType;

my $app = MyApp2->new();

my $worker = threads->create( \&work );

Wx::Event::EVT_COMMAND( $app->{"mainFrm"}, -1, $DONE_EVENT, \&done );

$app->MainLoop;

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

    print $event->GetData;
}

sub work {
    #!!! I would like send array OR hash insted of scalar here: my %result = ("key1" => 1, "key2" => 2 );
    # !!! How to do that?
    my $result = 100;

    my $threvent = new Wx::PlThreadEvent( -1, $DONE_EVENT, $result );
    Wx::PostEvent( $app->{"mainFrm"}, $threvent );**
}

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

#class contain empty form
package MyApp2;
use base 'Wx::App';


sub new {
    my $self   = shift;
    my $parent = shift;
    $self = {};

    $self = Wx::App->new( \&OnInit );


    bless($self);
    my $mainFrm = Wx::Frame->new( undef,-1,
        "My app - ",
        &Wx::wxDefaultPosition, 
        [ 300, 100 ]);

    $self->{"mainFrm"} = $mainFrm;
    $mainFrm->Show(1);
    return $self;
}

sub OnInit {
    return 1;
}

1;

0 ответов

Другие вопросы по тегам