Как я могу создать собственный тип события 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;