OVH Cloud OVH Cloud

créer un package Tk avec theads ?

4 réponses
Avatar
ctobini
Bonjour,

Je voudrais cr=E9er un petit package afin de faire une barre de
progression en Tk, je bute sur une chose :

Voici le d=E9but de mon package :

sub new {
my $class =3D shift;
my $max =3D shift;
#my $status_var =3D 0;
my $colors =3D [];
for (my $i =3D 0; $i <=3D 500; $i+=3D25) { push @$colors, ($i =3D> 'blue')=
}
my $mw =3D MainWindow->new;
$mw->ProgressBar(
-borderwidth =3D> 2,
-relief =3D> 'sunken',
-width =3D> 20,
-padx =3D> 2,
-pady =3D> 2,
-variable =3D> \$status_var,
-colors =3D> $colors,
#-colors =3D> [ 0 =3D> 'green',
#10 =3D> 'yellow',
#20 =3D> 'blue',
#30 =3D> 'green',
#40 =3D> 'yellow',
#50 =3D> 'blue',
#60 =3D> 'green',
#70 =3D> 'yellow' ,
#80 =3D> 'blue',
#90 =3D> 'red' ],
-resolution =3D> 0,
-blocks =3D> 50,
-anchor =3D> 'w',
-from =3D> '0',
-to =3D> '500'
)->pack(
-padx =3D> 10,
-pady =3D> 10,
-fill =3D> 'both',
-expand =3D> 1
);
MainLoop;
bless $mw, $class
}

Une fois que new() est appel=E9e, le script n'a plus du tout la main, je
pense que c'est =E0 cause de MainLoop (je ne peux pas par exemple
appeler 'destroy' sur la classe). Je n'ai jamais utilis=E9 de thread
mais je pense que c'est le moyen de 'piloter' cette cette classe.

Pourriez-vous m'en dire plus l=E0-dessus ?

En vous remerciant.

C=2E Tobini

4 réponses

Avatar
Paul Gaborit
À (at) 27 Sep 2006 08:00:30 -0700,
"ctobini" écrivait (wrote):
Je voudrais créer un petit package afin de faire une barre de
progression en Tk, je bute sur une chose :
[...]


Une fois que new() est appelée, le script n'a plus du tout la main, je
pense que c'est à cause de MainLoop (je ne peux pas par exemple
appeler 'destroy' sur la classe). Je n'ai jamais utilisé de thread
mais je pense que c'est le moyen de 'piloter' cette cette classe.

Pourriez-vous m'en dire plus là-dessus ?


Première chose : il est risqué voire impossible de faire un fork
depuis une application Tk (en tous cas dans l'implémentation actuelle)
sauf si on il est suivi immédiatement d'un 'exec' (côté fils). Pour
les threads, je n'en sais rien.

Ce qu'il est possible de faire :

1 - le processus Père prépare la tâche (sans Tk)

2 - Il fait un fork (en thread, je n'ai jamais testé) et le fils
charge Tk et crée l'interface.

Après, il faut encore gérer les communications entre le fils et le
père. Côté père, c'est du classique (quoique...). Côté fils, il faut
demander à Tk de surveiller un filehandle (celui qui communique avec
le père) en plus de la surveillance de l'interface.

On peut aussi utiliser une toute autre méthode :

1- créer l'interface en demandant (via 'after') le lancement d'une
procèdure juste après l'ouveture de la fenêtre.

2- la procèdure monopolise Perl (qui ne gère donc plus
l'interface). Mais si elle fait appel régulièrement à la méthode
'update' de Tk, on peut donner l'impression que l'interface
fonctionne.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
ctobini
Bonjour et merci de la réponse,

Je vais tenter en premier la méthode suivante :

Ce qu'il est possible de faire :

1 - le processus Père prépare la tâche (sans Tk)

2 - Il fait un fork (en thread, je n'ai jamais testé) et le fils
charge Tk et crée l'interface.

Après, il faut encore gérer les communications entre le fils et le
père. Côté père, c'est du classique (quoique...). Côté fils, il faut
demander à Tk de surveiller un filehandle (celui qui communique avec
le père) en plus de la surveillance de l'interface.


J'aurais besoin d'une précision: père et fils gèrent-ils la partie
Tk ou le père est en fait le 'main' du script (je n'ai jamais fait de
fork) ?

C. Tobini

Avatar
Paul Gaborit
À (at) 28 Sep 2006 05:29:49 -0700,
"ctobini" écrivait (wrote):
J'aurais besoin d'une précision: père et fils gèrent-ils la partie
Tk ou le père est en fait le 'main' du script (je n'ai jamais fait de
fork) ?


Seul le fils gère l'interface Tk. Le père ne doit même pas charger les
modules Tk. Le père effectue la "vraie" tâche.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
ctobini
Merci,

Je vais me documenter sur le fork et je reposterai dans quelques jours
je pense, le temps d'assimiler :)

En bientôt, bon w-e et merci encore.

C. Tobini

----------------------------


À (at) 28 Sep 2006 05:29:49 -0700,
"ctobini" écrivait (wrote):
J'aurais besoin d'une précision: père et fils gèrent-ils la partie
Tk ou le père est en fait le 'main' du script (je n'ai jamais fait de
fork) ?


Seul le fils gère l'interface Tk. Le père ne doit même pas charger les
modules Tk. Le père effectue la "vraie" tâche.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>