Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3191 connectés 

  FORUM HardWare.fr
  Programmation
  C

  boucle infinie = CPU 100% ?!

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

boucle infinie = CPU 100% ?!

n°1516502
nORKy
Grmmph...
Posté le 19-02-2007 à 16:04:59  profilanswer
 

Bonjour,
 
Quelqu'un serait me dire pourquoi mon sniffer (utilisant libpcap) qui est dans un pthread me bouffe 100% CPU ??
Merci

Message cité 1 fois
Message édité par nORKy le 20-02-2007 à 09:22:24
mood
Publicité
Posté le 19-02-2007 à 16:04:59  profilanswer
 

n°1516507
bad___day
Posté le 19-02-2007 à 16:15:09  profilanswer
 

nORKy a écrit :

Bonjour,
 
Quelqu'un serait me dire pourquoi mon sniffer (utilisant libpcap) qui est dans un pthread me bouffe 100% CPU ??
Merci


 
Il faut que tu met un mouchoir, et que tu ecrit dessu "we cannot guess your code source", et tu le place
entre ton modem et ta ligne de téléphone.
Comment se fait-il ??
c'est simple : Grâce aux mouchoirs stratégiquement posé sur ton câble modem, tu va réussir à faire dormir un peut le CPU, ce qui fait que ton sniffer ne bouffera plus 100% de CPU !
Et voilà ... remarque si ça marche pas c'est que la couleur de ton mouchoir n'est pas assez opaque...
 

n°1516515
Elmoricq
Modérateur
Posté le 19-02-2007 à 16:38:47  profilanswer
 

Il manque un point-virgule à la ligne 42.

n°1516649
Emmanuel D​elahaye
C is a sharp tool
Posté le 19-02-2007 à 20:28:47  profilanswer
 

Elmoricq a écrit :

Il manque un point-virgule à la ligne 42.


Je dirais plutôt "un ; en trop à la ligne 42" :  

Code :
  1. while (!fin); /* ligne 42 */
  2.        {
  3.             ...
  4.        }



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1516670
Elmoricq
Modérateur
Posté le 19-02-2007 à 21:35:43  profilanswer
 

Bien vu [:god]

n°1516674
xilebo
noone
Posté le 19-02-2007 à 21:47:52  profilanswer
 

Tu devrais poster un peu de code pour qu'on se rende mieux compte. Etant donné que la libpcap est plutot fiable, ca doit certainement venir d'une erreur de ta part.

n°1516682
Tamahome
⭐⭐⭐⭐⭐
Posté le 19-02-2007 à 22:58:01  profilanswer
 

Emmanuel Delahaye a écrit :

Je dirais plutôt "un ; en trop à la ligne 42" :  

Code :
  1. while (!fin); /* ligne 42 */
  2.        {
  3.             ...
  4.        }



 
ah oui, forcément, s'il écrit n'importe quoi... :fou:

n°1516765
nORKy
Grmmph...
Posté le 20-02-2007 à 09:22:00  profilanswer
 

Finalement, c'est pas la libpcap :-)
En fait, j'ai un autre thread qui fait une boucle infinie (qui est obligatoire)
C'est une boucle qui vérifie 'en gros' si il y a eut des timeouts. Il regarde des structures (liste chainée) avec des temps X et regarde si un temp X + un temp Y est inférieur à un temp T.
Puis, il recommence.
Mais comme je peux tolérer une marge, j'ai rajouté un usleep de 1000 (0.1 s ?) à la fin du parcour et je ne mange plus rien de mon CPU

n°1516804
lkolrn
<comment ça marche?>
Posté le 20-02-2007 à 10:05:21  profilanswer
 

nORKy a écrit :

usleep de 1000 (0.1 s ?)

Ca fait 1 milli-seconde. T'as calculé le temps complet d'un cycle d'une boucle ? pour la marge d'erreur


Message édité par lkolrn le 20-02-2007 à 10:21:51
n°1516809
Emmanuel D​elahaye
C is a sharp tool
Posté le 20-02-2007 à 10:19:24  profilanswer
 

nORKy a écrit :

En fait, j'ai un autre thread qui fait une boucle infinie (qui est obligatoire)


Si tu fais une boucle 'blanche', tu bouffes 100% du CPU. C'est horrible. Il faut mettre une suspension (sleep(1) : 1 ms suffit en général)

Message cité 1 fois
Message édité par Emmanuel Delahaye le 20-02-2007 à 10:33:05

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le 20-02-2007 à 10:19:24  profilanswer
 

n°1516814
Taz
bisounours-codeur
Posté le 20-02-2007 à 10:29:31  profilanswer
 

Emmanuel Delahaye a écrit :

Si tu fais une boucle 'blanche', tu bouffe 100% du CPU. C'est horrible. Il faut mettre une suspension (sleep(1) : 1 ms suffit en général)


ou bien arrêter de faire du polling et faire en sorte que la source de données génère des événements.

n°1516819
Emmanuel D​elahaye
C is a sharp tool
Posté le 20-02-2007 à 10:39:40  profilanswer
 

Taz a écrit :

ou bien arrêter de faire du polling et faire en sorte que la source de données génère des événements.


Question de conception. Les évènements, c'est bien théoriquement, mais on peut en louper. Le polling est souvent plus sûr et surtout plus siple à mettre en oeuvre...  
 
Tout dépend de ce qu'on fait... Ici, par exemple, si il est question de gérer des timers logiciels (timeouts, généralement d'une précision de 1 seconde), un simple polling à 10 ou 100 ms devrait suffire...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1516958
nORKy
Grmmph...
Posté le 20-02-2007 à 13:46:38  profilanswer
 

Beh, c'est bien ce que j'ai dit :-) mon usleep corrige très bien mon problème.  
Merci beaucoup

n°1516978
-ThX-
Not here anymore
Posté le 20-02-2007 à 14:01:23  profilanswer
 

Pourquoi pas organiser la gestion de ta boucle avec un sémaphore ?
Pas de données: je dors 10ms. Des données: je bosse.

n°1517510
nORKy
Grmmph...
Posté le 21-02-2007 à 11:32:18  profilanswer
 

Beh, si il y a des données, ca veut dire que j'ai toujours une boucle infinie quand même
 
J'explique mieux.
 
Imaginez une liste chainée. Chaque élément est représente un "truc". Chaque truc possède un temps X. Ce temps X est mis à jour régulièrement par le processus principale selon certaines condition.
Le thread lui, parcour la liste chainé à l'infinie et vérifie que ce temps X + un temps Y défini est inférieur au temps actuel T (principe du timeout en gros).
Si ce temps est supérieur, l'élément est retiré de la liste.
 
Je peux donc avoir tous le temps des données dans ma liste chainée si mon processus principale le désire.
.. et donc parcour sans arret la liste, ... et donc plus de pause, ... et donc, CPU qui ne s'arrete pas.
 
Mes temps X et Y sont mesuré en plusieurs dizaine de seconde, donc, arreté mon thread toute les 100ms ne gène pas le déroulement de mon prog, donc, actuellement, je pense que je vais rester comme ca
 
J'espère que j'ai été clair :=)


Message édité par nORKy le 21-02-2007 à 11:33:10

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  boucle infinie = CPU 100% ?!

 

Sujets relatifs
emulateur ps1 ps2 ps3 sa marche 100/100Faire tourner trois boucle for next en même temps ...?
Saleté de boucle[c/c++] lire des lignes en boucle jusqu'a EOF
Créer un tableau grâce à une boucleComment faire défiler un texte en boucle sous Flash ?
[MSSQL et PHP] Problème de boucle...pagination infinie sous ie7 !
[Résolu][VBS Débutant Boucle Do-While-Loop Active Directory]Faire une boucle qui n'affiche que les entrées différentes
Plus de sujets relatifs à : boucle infinie = CPU 100% ?!


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR