problème Perl/tk en multi thread

Le
RV
Bonjour,

j'ai un problème avec un programme en multithread ayant une interface
graphique en TK.

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é.

Bref je suis bloqué, si quelqu'un à une solution, un système pour
contourner cela, ou une librairie graphique equivalente à Tk mais qui
gère le multi-threading ???

Merci

hervé
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul Gaborit
Le #143895
À (at) 12 Apr 2007 03:12:26 -0700,
"RV"
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 - Perl en français -
RV
Le #143892
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
Paul Gaborit
Le #143790
À (at) 12 Apr 2007 11:04:09 -0700,
"RV"
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 - Perl en français -
Publicité
Poster une réponse
Anonyme