Limiter un thread

Résolu
cs_leroukin Messages postés 36 Date d'inscription jeudi 15 novembre 2007 Statut Membre Dernière intervention 23 juin 2010 - 27 déc. 2007 à 10:29
cs_leroukin Messages postés 36 Date d'inscription jeudi 15 novembre 2007 Statut Membre Dernière intervention 23 juin 2010 - 28 déc. 2007 à 16:56
Salut à tous,

j'ai pu lire de nombreux posts concernant les threads mais je me pose tjrs une question :

est-il possible de limiter le thread à, par exemple, 50% d'utilisation des ressources de la machine.
Dans mon cas , le thread peut faire un traitement tres important et peut donc faire lager ma machine et voir la faire planter ( en gros tant qu'il y a de le place roule ma poule je pépon du process...).
j'ai bien trouvé MonThread.Priority mais cela ne limite pas l'utilisation de la mémoire hélas :(.

Si le sujet existe déjà j'en suis désolé ^^'. Mais à priori je n'ai rien trouvé là dessus.

J'attends vos réponses avec impatience

9 réponses

WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
28 déc. 2007 à 11:25
En mode asynchrone ( ici en bas de page ), une boucle d'attente de l'envoi du message est codée contenant un DoEvents (équivalent du Application.ProcessMessages). Il serait bon d'intégrer une portion de code équivalent en Delphi dans ta boucle d'envoi et rendre ainsi la main au programme durant l'envoi du message.

N.B. As tu spécifié MaxThreads à une valeur raisonnable ?

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
3
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
27 déc. 2007 à 13:36
Bonjour,

L'utilisation de la mémoire et du CPU est lié au code qu'execute ton thread. Donc si tu veux limiter l'utilisation de la mémoire, il faut revoir la conception de ton code pour cela. Quand à la limitation de l'utilisation du CPU, tu peux rendre la main plus souvent pour les autres processus en ajoutant une pause de 100ms par un sleep(100).

P.S. Ne sachant ni ce que ton thread fait, ni comment il est codé, difficile de répondre plus précisement.

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
0
cs_leroukin Messages postés 36 Date d'inscription jeudi 15 novembre 2007 Statut Membre Dernière intervention 23 juin 2010
27 déc. 2007 à 14:26
le but de mon code est de faire du pushmail. l'utilisateur balance sa liste de destinataires ( pouvant etre de 5 à 3000 personnes ) et mon prog genere un email personnalisé en fonction de chaque utilisateur ( son adresse, info abonnement etc etc )

en gros :

While (Not TableEMAILLG.EOF) do
   MonEmail.send(param1,param2)

et tout cela se passe dans un Thread afin de ne pas bloqué l'appli le tps de lenvoi. Mais le problème est :
si MonEmail ( composant ANSMTP http://www.emailarchitect.net/webapp/smtpcom/) est en mode Synchrone, l'utilisation du CPU monte à 50% tres bien pas de problème, mais mon appli devient alors tres tres lente.
Si MonEmail est en mode Asynchrone, il semblerait ( je nai pas le code source du composant ANSMTP ) qu'il cree plusieurs threads à l'interieur de mon Thread et là mon appli fonctionne bien , mais par contre le CPU s'emballe jusqu à plantage ...

donc pkoi mon appli est super ralentie en mode synchrone ? comment léviter ? et comment eviter que mon CPU se blinde en mode asynchrone (autrement que avec des sleeps, jy avais effectivement pensé )

mon problème est pas évident et pas forcement claire mais si quelqu'un a une piste ou une petite idée  .. u welcome !
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
27 déc. 2007 à 16:03
Salut,

Si ton composant ANSMTP est en mode Asynchrone, il semble bien que l'appli conserve la trace d'un trop grand nombre de threads. En CPU monocore

, le maxi est de 16 threads actifs par processus...


Perso, je commencerais par surveiller l'état des Threads avec
Voir | Fenêtres de débogage | Threads.




 




PS: Que se passe-t'il si

MonEmail est en mode Synchrone et MonThread.Priority := tpIdle?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
27 déc. 2007 à 16:08
Encore un truc, peut-être...

Regarde l'Aide sur la classe TMultiReadExclusiveWriteSynchronizer.
C'est peut-être une piste.
0
cs_leroukin Messages postés 36 Date d'inscription jeudi 15 novembre 2007 Statut Membre Dernière intervention 23 juin 2010
27 déc. 2007 à 17:03
Merci Caribensila pour tes propositions.

Avec MonEmail en synchrone et MonThread.Priority en tpidle le resultat est le meme, l'application est tres tres ralentie.

Je regarde de suite TMultiReadExclusiveWriteSynchronizer, je ne connais pas du tout jvois ce que j'arrive à faire avec.

sinon une idée vient de me traverser l'esprit, peu être pourrais je agir directement sur MonEmail et "brider" l'objet plutot que d'agir au niveau du Thread ( c'est peu etre une grosse con**** ce que je dis là mais bon à voir :) )
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
27 déc. 2007 à 18:50
Quand on regarde le site du composant que tu as donné, il est précisé ici qu'il faut utiliser le "EASendMail Service".
Pourquoi ? 
Parce qu'il est tout simplement fait pour ( "It enables your application to send mass emails in background service. And it also supports picking the recipients from database in background and sending email in specified datetime")
Ce qui au final devrait solutionner ton problème.

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
0
cs_leroukin Messages postés 36 Date d'inscription jeudi 15 novembre 2007 Statut Membre Dernière intervention 23 juin 2010
28 déc. 2007 à 09:29
Hélas, WhiteHippo je ne peux utiliser EASendMail Service.
Pourquoi ?
Parceque :

"you should download EASendMail Service and install it on the server at first. If you are using a web hosting and you don't have permission to install service on the server, then EASendMail service is not suitable for you."

je ne veux pas passer par un serveur, mais uniquement par les DNS lookup, je ne peux donc pas utiliser EASendMail Service .

Je suis en train de regarder quelques astuces avec les TMultiReadExclusiveWriteSynchronizer.

Je vous tiens au courant rapidement afin de cloturer, j'espere, rapidement le sujet.

Cordialement.
0
cs_leroukin Messages postés 36 Date d'inscription jeudi 15 novembre 2007 Statut Membre Dernière intervention 23 juin 2010
28 déc. 2007 à 16:56
Après de mysthiques essais, ca fonctionne !!

j'utilise l'outil multithread FastSender fourni avec le composant ANSMTP.
cela ne bloque pas mon appli et j'arrive bien à limiter l'utilisation du CPU.

merci à vous 2 pour vos réponses qui m'ont d'une part permis davancer + vite mais aussi d'en apprendre + sur les threads !

Je cloture le sujet !
0
Rejoignez-nous