Without knowing how AnyEvent works, if the handler involves threads
then calling *any* GTK+ API from different threads than the one that
called `gtk_main()` is going to blow up your application. Even if it
worked in one release, during a specific alignment of planets, or if
you placed the machines in a pentacle drawn in goat blood, there's no
guarantee that it'll keep working. GTK+ simply does *not* support
multi-threaded access of the windowing system resources.

GTK+ and the G* platform has a whole bunch of API to deal with these
cases, like GTask[0]. Sadly, it's not very Perlish because nobody
wrote introspection overrides for it. Additionally, for things like
HTTP requests, there's a whole library called libsoup[1] which
integrates with the GLib main loop.

Ciao,
 Emmanuele.

[0]: https://developer.gnome.org/gio/stable/GTask.html
[1]: https://developer.gnome.org/libsoup/stable/

On 10 March 2017 at 15:27, Peter Juhasz <peter.juhas...@gmail.com> wrote:
> The plot thickens.
>
> I've got a very helpful tip about Berrybrew (
> https://github.com/stevieb9/berrybrew ), which is a Windows analog to
> Perlbrew, allowing multiple versions of Strawberry Perl to coexist on the
> same system. I've installed Glib (1.305), Gtk2 (1.2498), AnyEvent (7.13),
> AnyEvent::HTTP (2.23) on all versons between 5.12 and 5.24, and ran the test
> script on all of them. 5.16.3 and below works, 5.18.4 and above fails.
>
> The following test program demonstrates the issue even more dramatically:
> ##################
> #!/usr/bin/perl
>
> use strict;
> use warnings;
> use feature qw/say/;
> use Gtk2 -init;
>
> use AnyEvent;
> use AnyEvent::HTTP;
>
> my $w = Gtk2::Window->new();
> my $l = Gtk2::Label->new();
>
> $l->set_text("init");
> $w->add($l);
> $w->show_all();
>
> my $wa; $wa = AnyEvent->timer(after => 2.0, interval => 2.0, cb => sub {
>     http_request('GET',
>         'http://www.fsz.bme.hu/cgi-bin/ltime',
>         sub {
>                 my ($response_body, $response_headers) = @_;
>                 $l->set_text($response_body);
>         }
>     );
>
>     $l->set_text("ready");
> });
>
>
> Gtk2->main();
> #######################
>
> On Perl 5.16.3 and below it fetches the data from the network and displays
> it in a window, on 5.18.4 and above it hangs.
>
> I've looked at the perldelta docs for 5.18 but nothing obvious stood out.
>
> Now what?
>
> Peter
>
>
> On Thu, Mar 9, 2017 at 5:32 PM, Brian Manning <c...@xaoc.org> wrote:
>>
>> On Wed, Mar 8, 2017 at 4:58 AM, Peter Juhasz <peter.juhas...@gmail.com>
>> wrote:
>> > Dear Gtk-Perl experts,
>> >
>> > We have a legacy Gtk2 application that occasionally has to send HTTP
>> > requests asynchronously.
>> > We've noticed that it hangs on Windows with recent perls.
>>
>> What was the last versions of Perl/Gtk2/Glib/AnyEvent that worked for
>> you on Windows?
>>
>> > Finally, my question:
>> > is there any hope that this issue will be fixed, or at least its cause
>> > be
>> > found, or should we abandon this approach entirely?
>>
>> I'm going to guess that you're the only person trying to do this; you
>> may want to take that into consideration.
>>
>> Thanks,
>>
>> Brian
>
>
>
> _______________________________________________
> gtk-perl-list mailing list
> gtk-perl-list@gnome.org
> https://mail.gnome.org/mailman/listinfo/gtk-perl-list
>



-- 
https://www.bassi.io
[@] ebassi [@gmail.com]
_______________________________________________
gtk-perl-list mailing list
gtk-perl-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-perl-list

Reply via email to