From 4de7ff82b202dbef8c57954126932710fe1a82bd Mon Sep 17 00:00:00 2001 From: dakkar Date: Thu, 6 Aug 2009 15:15:03 +0200 Subject: AnyEvent (untested), method rename, proper structure --- t/01-glib.t | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 t/01-glib.t (limited to 't/01-glib.t') diff --git a/t/01-glib.t b/t/01-glib.t new file mode 100644 index 0000000..491e4b3 --- /dev/null +++ b/t/01-glib.t @@ -0,0 +1,60 @@ +#!/usr/bin/perl +use strict; +use warnings; +use threads; +use Glib; +use Thread::Queue::Event; +use Thread::Queue::Event::Glib; + +=head1 Signaling across threads to a Glib loop + +Looks like the best way is to use a pipe + +=cut + +my $q=Thread::Queue::Event->new()->with_role('Glib'); +my $q2=Thread::Queue::Event->new(); + +threads->create( + sub{ + print "(1) sleeping\n"; + sleep 2; + print "(1) sending boo\n"; + $q->enqueue('boo'); + sleep 2; + threads->create( + sub{ + print "(2) inserting bar & foo\n"; + $q->insert(0,'bar'); + $q->insert(1,'foo'); + print "(2) signaling\n"; + $q->signal(); + print "(2) signaling\n"; + $q->signal(); + }); + sleep 2; + print "(1) waiting for command\n"; + my $cmd=$q2->dequeue; + print "(1) got $cmd\n"; + print "(1) sending quit"; + $q->enqueue('quit'); +}); + +my $loop=Glib::MainLoop->new(); +$q->callback(sub{ + print "(m) waking up\n"; + my $foo=$q->dequeue(); + print "(m) got $foo\n"; + if ($foo eq 'quit') { + print "(m) quitting\n"; + $loop->quit; + } + elsif ($foo eq 'foo') { + print "(m) sending command\n"; + $q2->enqueue('the command'); + print "(m) sent command\n"; + } + return Glib::SOURCE_CONTINUE; + }, + ); +$loop->run; -- cgit v1.2.3