Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

problème Perl/tk en multi thread

3 réponses
Avatar
RV
Bonjour,

j'ai un probl=E8me avec un programme en multithread ayant une interface
graphique en TK.

Le probl=E8me vient du fait que je veux faire un widget->update du 2=E8me
thread que j'ai cr=E9=E9, et cela pose probl=E8me au niveau des acc=E8s, et
surtout les lib=E9ration des ressources.
"Xlib : unexpected async reply (sequence 0x174)"
J'ai lu sur un forum que le probl=E8me vient du fait que les commandes
graphiques doivent =EAtre pass=E9es du thread principal.
Je me trouve assez bloqu=E9 car je ne voit pas comment faire. A la
limite j'utilise un semphore dans le main, mais le probl=E8me c'est
qu'avec Tk, on ne peut pas faire de d'attente =E0 cause de la boucle
Mainloop, sinon le graphique est bloqu=E9.

Bref je suis bloqu=E9, si quelqu'un =E0 une solution, un syst=E8me pour
contourner cela, ou une librairie graphique equivalente =E0 Tk mais qui
g=E8re le multi-threading ???

Merci

herv=E9

3 réponses

Avatar
Paul Gaborit
À (at) 12 Apr 2007 03:12:26 -0700,
"RV" écrivait (wrote):
j'ai un problème avec un programme en multithread ayant une interface
graphique en TK.


Réellement en multithread ou en multiprocessus ?

Le problème vient du fait que je veux faire un widget->update du 2ème
thread que j'ai créé, et cela pose problème au niveau des accès, et
surtout les libération des ressources.
"Xlib : unexpected async reply (sequence 0x174)"
J'ai lu sur un forum que le problème vient du fait que les commandes
graphiques doivent être passées du thread principal.
Je me trouve assez bloqué car je ne voit pas comment faire. A la
limite j'utilise un semphore dans le main, mais le problème c'est
qu'avec Tk, on ne peut pas faire de d'attente à cause de la boucle
Mainloop, sinon le graphique est bloqué.


Plutôt qu'un sémaphore, on peut utiliser une surveillance de fichier
(ou de socket) via Tk::fileevent.

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

Avatar
RV
oui, c'est bien du multithread (use Threads;)
l'interface consiste en une listbox, listant un dossier,
et j'utilise un 2ème thread pour surveiller le dossier.
J'utilise File::Monitor, c'est le seul module que j'ai réussi à mettre
en oeuvre, j'ai bien galérer, je suis ouvert à tout autre module tant
qu'il fonctionne facilement et réellement. faites de propositions
ce 2ème thread fait appel à listbox->update, parce que j'ai remarqué
que la listbox ne se mettait pas à jour quand je rechargeais les
éléments. 5delete et insert...)
Il faut passer la souris devant ou bouger la fenêtre...

Donc, la solution est de forcer le raffraîchissement graphique du
widget, et j'ai pris le plus simple avec w->update, mais ça pose
problème quand je l'appel du 2ème thread.

sinon il y a la solution d'envoyer au gestionnaire des fenêtres un
message pour le raffraîchissement, équivalent à celui qui est envoyer
à la fenêtre quand la souris passe devant et qu'il se raffraichit tout
seul.
Je sais qu'il y a moyen de faire cela sous windows mais sous Linux, je
ne connais pas assez, et je pense que ça dépend de la distrib
graphique, donc, je ne sais pas si c'est une bonne idée...

je vais regarder Tk::event, voir si je peux utiliser un event virtuel
avec la touche F5 pourquoi pas, mais bon, je trouve que c'est de la
bidouille, ça me motive pas plus que ça
mais je vais regarder quand même
Avatar
Paul Gaborit
À (at) 12 Apr 2007 11:04:09 -0700,
"RV" écrivait (wrote):
je vais regarder Tk::event, voir si je peux utiliser un event virtuel
avec la touche F5 pourquoi pas, mais bon, je trouve que c'est de la
bidouille, ça me motive pas plus que ça
mais je vais regarder quand même


Je ne suis pas sûr que Tk::event soit adapté à votre besoin. Ce que je
conseillais, c'est Tk::filevent. Il suffit d'ouvrir un socket de
communication entre les deux threads. Puis, via Tk::filevent, on peut
associer un callback à ce socket qui sera appelé par la MainLoop de Tk
à chaque fois qu'il y aura quelque chose à lire sur le socket. Donc,
lorsque le second thread écrit quelque chose sur le socket, le
callback du premier thread se déclenche et on peut faire tout ce qu'on
veut sur l'interface.

Ça marche très bien en multi-processus. Je n'ai jamais testé en
multithread.


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