2015-01-16 8:14 GMT+01:00 Brian Manning <c...@xaoc.org>:
> On Thu, Jan 15, 2015 at 9:21 AM, Prunk Dump <prunkd...@gmail.com> wrote:
>> But if I fork the command with "open" in a callback, the gtkmain
>> thread hangs until the command finish. I'm sure that the open call is
>> non-blocking.
>>
>> sub my_callback {
>>
>>    my $fd = FileHandle->new()
>>    open($fd, "mycommand | ") or quitCallback("can't fork")
>>
>> }
>> --> hang on return
>>
>> I don't really understand why. Maybe Gtk make the callbacks with new
>> threads and wait the result with waitpid ?
>
> No, threads aren't the answer here.
>
> I'm guessing that your script hangs because you never read from the
> opened filehandle in your callback, so "mycommand" never exits because
> it's waiting for it's data to be read.
>
>> On all gtk2::helper examples I've found, the "open" call is made
>> before Gtk2->main. How can I do if the windows is already displayed
>> and if I'm inside gtkmain ?
>
> There's an example in the Gtk-Perl FAQ that uses
> Gtk2::Helper->add_watch after the GUI has been displayed;
>
> https://wiki.gnome.org/Attic/GTK2-Perl/FrequentlyAskedQuestions#How_do_I_keep_my_GUI_updating_while_doing_a_long_file_read.3F
>
> Instead of calling open() in the callback as in your code snippet, you
> make the open() call by itself, assign the filehandle created by the
> open() call to a $variable, then add a watch on that filehandle
> $variable via Gtk2::Helper->add_watch/Glib::IO->add_watch.
> Gtk2::Helper->add_watch is just a wrapper around Glib::IO->add_watch
> anyways.
>
> Jeffery also suggested previously using IPC::open3 and
> Glib::IO->add_watch to accomplish the same thing.
>
> The FAQ also has an example of using the "threads" module, if you're
> really trying to use threads, but using open() and adding a watch to
> the filehandle will do what I think you are asking for, with less
> pain.
>
> Thanks,
>
> Brian
>
> http://perldoc.perl.org/functions/open.html
> http://perldoc.perl.org/perlipc.html#Using-open()-for-IPC


Thank you very much for your help !!!

After some experiments using your propositions I finally found the
problem ! In the callback function I have created a local variable to
store the file handle :

sub my_callback {
   my $fd = FileHandle->new()
   open($fd, "mycommand | ") or quitCallback("can't fork")
}
--> hang on return

So when perl return it want to free the local $fd file descritor and
it can't because it is used for pipe redirection. Even if I pass the
local variable to the gtk2::helper->add_watch callback the problem
persist :

sub my_callback {
   my $fd = FileHandle->new()
   open($fd, "mycommand | ") or quitCallback("can't fork")
   $tag = Gtk2::Helper->add_watch($fd->fileno, 'in', sub {
watcher_callback( $fd, $tag ); });
}
--> hang on return

But changing the $fd variable for a global variable fix the problem !!!

my $globalFd;
my $globalTag;
sub my_callback {
   my $globalFd = FileHandle->new()
   open($globalFd, "mycommand | ") or quitCallback("can't fork")
   $globalTag = Gtk2::Helper->add_watch($globalFd->fileno, 'in', sub {
watcher_callback( $globalFd, $globalTag ); });
}

Thank you very much again !

Baptiste.
_______________________________________________
gtk-perl-list mailing list
gtk-perl-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-perl-list

Reply via email to