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 ???
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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/>
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/>
À (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/>
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
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
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
À (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/>
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/>
À (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/>