Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

TCP et NetworkStream avec un DO/LOOP = 100% de cpu...

5 réponses
Avatar
llopht
Salut à tous,

J'ai une petite application qui récupère des mails via le protocole POP3.
Lorsque j'obtiens le résultat de la commande RETR j'ai une boucle DO
WHILE...LOOP qui récupère les données entrantes du networkstream jusqu'à
tant que j'obtienne un . (signifiant qu'il n'y a plus de données... pour
ceux qui ne connaissent pas). A cause de la boucle et de la longueur des
messages j'ai 100% du CPU utilisé. J'ai beau essayé de mettre un
application.doevents ou thread.sleep(0) ça ne change rien... Bon si je mets
thread.sleep(5) ça passe mais du coup ça devient franchement lent.

Une idée pour me sortir de là ?

Merci

llopht

5 réponses

Avatar
Paul Bacelar
Pourquoi ne pas utiliser un thread dédié pour la récupération des données
avec une priorité adaptée ?
--
Paul Bacelar
MVP VC++


"llopht" wrote in message
news:Og%
Salut à tous,

J'ai une petite application qui récupère des mails via le protocole POP3.
Lorsque j'obtiens le résultat de la commande RETR j'ai une boucle DO
WHILE...LOOP qui récupère les données entrantes du networkstream jusqu'à
tant que j'obtienne un . (signifiant qu'il n'y a plus de données... pour
ceux qui ne connaissent pas). A cause de la boucle et de la longueur des
messages j'ai 100% du CPU utilisé. J'ai beau essayé de mettre un
application.doevents ou thread.sleep(0) ça ne change rien... Bon si je
mets
thread.sleep(5) ça passe mais du coup ça devient franchement lent.

Une idée pour me sortir de là ?

Merci

llopht






Avatar
llopht
En fait l'application fait "plusieurs choses" et j'utilise déjà un thread du
pool pour récupérer les messages (d'où la question sur mon post suivant).
Maintenant je pense qu'il doit bien y avoir une possibilité, utiliser une
boucle do/loop avec un flux est forcément gourmand en ressources car rien ne
laisse au système et aux autres applications le temps de traiter leurs
données/messages.
Avatar
Paul Bacelar
Il n'est pas conseiller d'utiliser un thread du ThreadPool de .NET pour des
tâches de longue durée.

Je te conseille d'utiliser pour cela un thread dédié.

Je ne comprends pas ta remarque sur ta boucle gourmande.

Si ta boucle est une attente active, il faut absolument rendre ton attente
bloquante sur réception de donnés ou réception de demande de fin de boucle
pour avoir une boucle qui tient la route.


--
Paul Bacelar
MVP VC++

"llopht" wrote in message
news:
En fait l'application fait "plusieurs choses" et j'utilise déjà un thread
du pool pour récupérer les messages (d'où la question sur mon post
suivant). Maintenant je pense qu'il doit bien y avoir une possibilité,
utiliser une boucle do/loop avec un flux est forcément gourmand en
ressources car rien ne laisse au système et aux autres applications le
temps de traiter leurs données/messages.




Avatar
llopht
> Il n'est pas conseiller d'utiliser un thread du ThreadPool de .NET pour
des tâches de longue durée.



Tu peux me de donner la raison ?

Je ne comprends pas ta remarque sur ta boucle gourmande.



:):):)

En gros je fais :

- Envoi de la commande RETR numéodumail au serveur SMTP
- J'attends la réponse avec un networkstream que je convertie en string
- Tant que la réponse renvoyé ne contient pas une ligne avec un point je
continu de lire les nouvelles lignees renvoyés par le stream au travers
d'une boucle do/while

Lorsque je suis dans la boucle do/while le CPU monte a 100% et ne laisse pas
aux autres threads le temps de fonctionner.

Si je ralenti son traitement avec un thread.sleep(5) pour tester je consomme
plus rien en CPU.

Jerome


Si ta boucle est une attente active, il faut absolument rendre ton attente
bloquante sur réception de donnés ou réception de demande de fin de boucle
pour avoir une boucle qui tient la route.




CAD ?

--
Paul Bacelar
MVP VC++

"llopht" wrote in message
news:
En fait l'application fait "plusieurs choses" et j'utilise déjà un thread
du pool pour récupérer les messages (d'où la question sur mon post
suivant). Maintenant je pense qu'il doit bien y avoir une possibilité,
utiliser une boucle do/loop avec un flux est forcément gourmand en
ressources car rien ne laisse au système et aux autres applications le
temps de traiter leurs données/messages.








Avatar
Paul Bacelar
"llopht" wrote in message
news:
Il n'est pas conseiller d'utiliser un thread du ThreadPool de .NET pour
des tâches de longue durée.



Tu peux me de donner la raison ?



Le ThreadPool de .NET a un nombre limité de thread et si vous en monopolisez
plusieurs, il n'y en aura plus pour les autres.


Je ne comprends pas ta remarque sur ta boucle gourmande.



:):):)

En gros je fais :

- Envoi de la commande RETR numéodumail au serveur SMTP
- J'attends la réponse avec un networkstream que je convertie en string
- Tant que la réponse renvoyé ne contient pas une ligne avec un point je
continu de lire les nouvelles lignees renvoyés par le stream au travers
d'une boucle do/while

Lorsque je suis dans la boucle do/while le CPU monte a 100% et ne laisse
pas aux autres threads le temps de fonctionner.




A moins d'avoir une attente active, vous utilisez 100% du CPU à bon escient.

Utilisez les priorités des threads pour arbitrer entre plusieurs tâches
simultanées.


Si je ralenti son traitement avec un thread.sleep(5) pour tester je
consomme plus rien en CPU.




Normal, vous ne faites plus rien ;-).

Jerome


Si ta boucle est une attente active, il faut absolument rendre ton
attente bloquante sur réception de donnés ou réception de demande de fin
de boucle pour avoir une boucle qui tient la route.




CAD ?



Les lectures doivent être bloquantes.


--
Paul Bacelar
MVP VC++

"llopht" wrote in message
news:
En fait l'application fait "plusieurs choses" et j'utilise déjà un
thread du pool pour récupérer les messages (d'où la question sur mon
post suivant). Maintenant je pense qu'il doit bien y avoir une
possibilité, utiliser une boucle do/loop avec un flux est forcément
gourmand en ressources car rien ne laisse au système et aux autres
applications le temps de traiter leurs données/messages.














--
Paul Bacelar
MVP VC++