Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/10/2011, à 19:05

luigifab

[Résolu] [PERL/GTK] Une histoire de Gtk2 main et main_quit

Bonsoir

J'essaye de faire un petit programme utilisant les notifications systèmes.
Ci-dessous une capture de ce que j'ai réussi à faire (fonctionne sous Debian 6, je ne sais pas pour Ubuntu).

png41295710201118267.png

Mon soucis est que le programme qui permet d'afficher cette info-bulle se termine uniquement lorsque l'info-bulle se ferme.
Je sais que cela est du au Gtk2->main;, cependant, en le supprimant l'action du bouton ne fonctionne plus.

Le problème est que le terminal qui a lancé le programme attend que l'info bulle se ferme pour rendre la main à l'utilisateur.
Est-il possible de dire au programme de rendre la main, mais en continuant à tourner pour que le bouton fonctionne ? ou autre ?

#!/usr/bin/perl
use strict;
use warnings;
use Gtk2::Notify -init, 'Multi Actions';

my $url = 'http://www.google.fr';

my $n = Gtk2::Notify->new('Test', 'Installation termine');
$n->signal_connect(closed => sub { Gtk2->main_quit });
$n->set_timeout(10000);
$n->add_action('3d-colors', 'Ouvrir le navigateur', sub { system "xdg-open $url"; Gtk2->main_quit; });
$n->show;

Gtk2->main;

Dernière modification par luigifab (Le 30/10/2011, à 14:00)


Free Ukraine!

Hors ligne

#2 Le 29/10/2011, à 19:18

HP

Re : [Résolu] [PERL/GTK] Une histoire de Gtk2 main et main_quit

Lance la notification dans un thread… tout simplement.


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#3 Le 29/10/2011, à 21:44

luigifab

Re : [Résolu] [PERL/GTK] Une histoire de Gtk2 main et main_quit

Pas bête comme idée...
Sauf que je suis pas sur de ce que je fais ni si cela va résoudre mon problème.

Ci-dessous mon nouveau programme, qui ne fonctionne pas très bien
En effet, il affiche, 1, 2 et se termine. Aucune erreur et pas de notification.

En revanche, si je change $thread->detach par $thread->join pour que le programme se termine lorsque tous les threads sont également terminés, le programme affiche 1, 2, 3, 4 et 5, affiche la notification, se termine et rend la main à l'utilisateur, 10 secondes plus tard.

Je ne veux pas que le programme attende que la notification se termine.
Cela m'est pas utile, puisque tout les traitements sont terminés.

#!/usr/bin/perl
use strict;
use warnings;
use threads;

sub sub1 {
    my $url = shift;
    print "1\n";
    
    use Gtk2::Notify -init, 'Multi Actions';
    print "2\n";

    my $n = Gtk2::Notify->new('Test', 'Installation', '/usr/share/icons/gnome/scalable/actions/gnome-stock-mail-new.svg');
    print "3\n";
    $n->signal_connect(closed => sub { Gtk2->main_quit });
    $n->set_timeout(10000);
    $n->add_action('3d-colors', 'Ouvrir le navigateur', sub { system "xdg-open $url"; Gtk2->main_quit; });
    $n->show;
    print "4\n";

    Gtk2->main;
    print "5\n";
}

my $thread = threads->new(\&sub1, 'http://www.google.fr/');
$thread->detach;

Free Ukraine!

Hors ligne

#4 Le 30/10/2011, à 11:12

JoelS

Re : [Résolu] [PERL/GTK] Une histoire de Gtk2 main et main_quit

Si tu veux que le programme/processus rende la main alors qu'il effectue quelque chose (l'affichage et la gestion de la bulle en l'occurrence), tu te rendes compte qu'il y a un problème dans l'énoncé :-)

Les threads ne changent rien à ça: un thread est un fil d'exécution indépendant des autres threads (plus ou moins) mais bien au sein d'un même processus. Celui-ci ne peut se terminer que quand le dernier thread a fini.

Le seul moyen est le suivant: ton programme principal va en fait lancer un autre programme (qui sera donc son fils, dans une relation pére/fils) et ensuite détacher ce fils pour qu'il vive sa vie tranquille. Puis le père peut mourir (rendre la main).

La façon de démarrer le fils et de le détacher dépend de ce que tu veux faire exactement avec le fils. Notamment comme le père ne surveille plus son fils, il n'y a pas de moyen fiable intrinsèque au noyau pour surveiller l'exécution du fils. Il faut le gérer dans le programme du fils lui-même, une simple création d'un fichier PID stockant le process-ID du fils est un bon début. Mais on peut aussi imaginer que le fils s'enregistre via un bus de données quelque part.

Dans ton cas, je pense qu'il n'y a pas ce problème du moins au début.

Donc un simple lancement détaché en arrière plan d'un processus est suffisant.

Regardes en Perl comment on fait ça (man perlfaq te donnes les pages de FAQ de Perl, dans ton cas regardes ce qui touche à l'interaction avec le système). Un programme Perl peut lui même se redémarrer en tant que fils, et savoir au sein du code s'il est le père ou le fils (regardes fork et exec via man perlfunc).

Sinon en shell tu écris:

mon-programme-perl > /mon/fichier/log 2>&1 &

mais tu as beaucoup moins de capacité de contrôle.

Hors ligne

#5 Le 30/10/2011, à 14:00

luigifab

Re : [Résolu] [PERL/GTK] Une histoire de Gtk2 main et main_quit

Je n'ai pas besoin de contrôler le processus lancé en arrière plan.
En effet, celui-ci ne fait qu'afficher une info-bulle.

Avant de le faire je m'assure que les composants soit disponibles.
Et quand bien même il n'y arriverai pas, cela n'aurai aucune conséquence.

Le seul moyen est le suivant : ton programme principal va en fait lancer un autre programme (qui sera donc son fils, dans une relation pére/fils) et ensuite détacher ce fils pour qu'il vive sa vie tranquille. Puis le père peut mourir (rendre la main).

En suivant ceci, j'ai utilisé le module Proc::Simple de Perl pour arriver à mes fins.
Est-ce bien ou pas bien, je ne saurais dire.

#!/usr/bin/perl
use strict;
use warnings;

if (-Proc::Simple && -Gtk2::Notify && (-x '/usr/bin/xdg-open')) {
    use Proc::Simple;
    my $notif = Proc::Simple->new();

    $notif->start(sub {
            use Gtk2::Notify -init, 'monprogramme';

            my ($text, $logo, $btn, $url) = @_;
            my $gtk = Gtk2::Notify->new('Mon super programme', $text, $logo);

            $gtk->add_action('internet', $btn, sub {
                system 'xdg-open', $url;
                Gtk2->main_quit;
            });

            $gtk->signal_connect(closed => sub { Gtk2->main_quit });
            $gtk->set_timeout(6000);
            $gtk->show;

            Gtk2->main;
            exit(0);
        },
        'Installation terminée !',
        '/usr/share/icons/gnome/scalable/actions/gnome-stock-mail-new.svg',
        'Ouvrir le navigateur',
        'http://localhost/dd/index.php'
    );
}

En tout cas, merci pour vos idées qui m'ont beaucoup aidées.


Free Ukraine!

Hors ligne