Bonjour à tous,
Le C n'est pas mon terrain de jeu préféré et je viens de découvrir
GTK il y a environ 2 semaines. Mon objectif primaire était de développer
un applet gnome capable de monitorer et de changer la frequence de ma
carte graphique(à cause des problèmes de drivers...). Comme ça avait l'air
un peu complexe j'ai d'abord commencé par réécrire une version "LIGHT" du
célèbre applet cpufreq qui aurait pour but de monitorer mon cpu...
Pendant toute la période de développement j'ai lancé mon applet
en mode "debugg" c'est à dire que je lance l'applet en ligne de commande
puis je l'ajoute au panel et LA le programme se lance réellement et je
peux voir tous mes petits printf de debug.
J'ai donc un truc très classique qui affiche une icone cpu et un
label tous deux rafraichis dynamiquement. Pour se faire, à la fin de ma
fonction d'initialisation je lance un thread qui boucle et met à jour ces
2 élément (change l'icone, modifie la couleur du label...)
ET TOUT FONCTIONNE A MERVEILLE !!!!!!!!!!!!!!!!
Seulement au moment où je décide de lancer mon applet en mode
classique (en l'ajoutant directement au panel et sans le lancer au
préalable en ligne de commande) : CA FREEEEEZZZZZZZ
(ça plante au moment d'un set_image_from_file(), l'icone disparait
et l'applet freeze, obligé de le killer)
=> Evidemment pour debugger j'ai du rediriger la sortie standard vers
un fichier... et après avoir fouiller pendant des heures je m'aperçois
qu'en mettant un sleep(5) juste avant que le thread ne commence son
travail tout fonctionne !!!
=> 1ere conclusion : mon set_image_from_file() est effectué trop tôt?
Donc je met un set_image_from_file() avant même de lancer mon thread
(donc vers la fin de ma fonction d'initialisation) et LA, ça ne plante
pas !!!
=> 2eme conclusion : Rien à voi avec ma première conclusion
--> le multithread en GTK ça doit pas fonctionner comme ça
J'ai essayer de me binder sur un signal pour retarder le lancement du thread
mais après une 20aine d'essais j'ai abandonner... J'ai aussi entendu parler
d'un gtk_main_iteration (), mais je n'ai pas vraiment saisis son fonctionnement.
De plus dans le cas de mon applet je n'ai pas de fonction main.
C'est pourquoi je m'en remets à vous car je commence à être à cours d'idées.
Dans le cas où une solution serait apportée, j'aimerai quand même savoir
pourquoi quand je lance cet applet en ligne de commande ça fonctionne!!
Et pourquoi avec un malheureux sleep de 5 ça fonctionne aussi ??
Voici mon archive : http://membres.lycos.fr/poumpoumk/cp...pufreqp.tar.gz
(ce n'est qu'à l'état de test pour le moment, ne faites pas attention
au printf de debug horribles que je viens de rajouter lol)
Le fichier principal est cpufreq.c.
Pour l'installer make, make install(en root)...
Et pour profiter du changement de gouverneur il faut faire un visudo
et autoriser l'exécution du script /etc/scripts/cpufreq.sh
MERCI d'avance à tous ceux qui pourront m'aider.
Partager