thread écoutant hal (spécifique à linux)

thread écoutant hal (spécifique à linux) - C - Programmation

Marsh Posté le 15-05-2006 à 14:07:49    

Bonjour,
 
Dans mon programme, je lance un thread qui 'ecoute' une variable globale (que je met à jour par l'intermédiaire de l'interface de hal) . Le problème est que pour l'instant, mon thread boucle avec un

Code :
  1. while(1)
  2. sleep(1);


 
Mais il semble que lorsque je fais un appel à sleep(), mon programme n'entend pas les changements faits par hal.  
 
J'ai essayé de remplacer cette boucle par gtk_main() mais d'abord c'est très dégueulasse et ensuite pour quitter j'utilise gtk_main_quit() ce qui est encore plus moche (en plus de ne pas fonctionner entièrement).
 
Avez-vous une idée de comment résoudre ca ? Est-il possible d'endormir que le thread et pas le programme entièrement car j'ai l'impression que c'est cela qui se passe ?
 
Nb : si je n'ai pas été clair, faites le savoir car là, je suis à cours de batterie.
 
Edit: relecture.  :D


Message édité par Photonium le 15-05-2006 à 19:39:44

---------------
A savoir : la dimension de Hausdorff du chou-fleur a été calculée et vaut 2.33
Reply

Marsh Posté le 15-05-2006 à 14:07:49   

Reply

Marsh Posté le 15-05-2006 à 19:41:09    

:bounce: Je ferais des précisions dans quelques instants si je n'ai toujours pas de réponse.


---------------
A savoir : la dimension de Hausdorff du chou-fleur a été calculée et vaut 2.33
Reply

Marsh Posté le 15-05-2006 à 20:04:26    

tu veux dire que ton thread fait sleep(1) sans s'arreter et qu'il ne se met pas à jour ?


---------------
Töp of the plöp
Reply

Marsh Posté le 15-05-2006 à 21:21:28    

_darkalt3_ a écrit :

tu veux dire que ton thread fait sleep(1) sans s'arreter et qu'il ne se met pas à jour ?


 
Non, il y a un test.

Code :
  1. static void mafonction (void *arg) {
  2.   pthread_detach(pthread_self());
  3. .... //initialisation  
  4.   while(1) {
  5.     if (canceled)
  6.       pthread_exit(NULL);
  7.     sleep(1);
  8.      if (received)
  9.         break;
  10.     }
  11.   DEBUGP("Received Msg\n" );
  12.    ... //traitement
  13.   DEBUGP("exited\n" );
  14.   pthread_exit(NULL);
  15. }


 
Received est positionné à 1 par un callback de Hal. (LibHalDeviceAdded pour etre plus précis)
Canceled est sans importance ici.
 
Or avec ce code, received n'est pas mis à 1 et pire que çà : LibHalDeviceAdded n'est pas appelée.  
 
Je pense donc que le sleep agit sur le programme entier et non sur le thread. Comment remédier à cela ?
 
Edit: petite précision, lorsque j'utilise gtk_main() à la place de mon while (et en modifiant un peu mon code pour avoir le même resultat), je n'ai pas ce problème de mutisme de hal. J'en au un autre du fait que ce soit gtk_main() et que je l'utilise pour ce qu'elle n'est pas.  
Avec gtk_main(), j'ai le bon comportement. Comment gtk_main() fonctionne ? Avec un systeme de while + sleep ?
 
Edit2: il semble que (selon le man), sleep n'agit que sur le process appelant. Bizarre. Infos ?


Message édité par Photonium le 15-05-2006 à 21:57:08

---------------
A savoir : la dimension de Hausdorff du chou-fleur a été calculée et vaut 2.33
Reply

Marsh Posté le 16-05-2006 à 13:52:23    

Bonjour,
 
Je pense avoir trouvé. Dans mon code, j'utilise dbus_connection_setup_with_g_main(). J'utilise dbus-glib donc je présume qu'en fait, la meilleure façon (la seule façon ?)  d'écouter hal est de boucler le thread avec une boucle 'glib'.
 
Si certains d'entre vous connaissent tout ce qui touche à  Dbus/hal/glib, pouvez-vous m'éclairer un peu plus ?


---------------
A savoir : la dimension de Hausdorff du chou-fleur a été calculée et vaut 2.33
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed