cs_leroukin
Messages postés36Date d'inscriptionjeudi 15 novembre 2007StatutMembreDernière intervention23 juin 2010
-
27 déc. 2007 à 10:29
cs_leroukin
Messages postés36Date d'inscriptionjeudi 15 novembre 2007StatutMembreDernière intervention23 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.
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 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
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 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
cs_leroukin
Messages postés36Date d'inscriptionjeudi 15 novembre 2007StatutMembreDernière intervention23 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 !
cs_leroukin
Messages postés36Date d'inscriptionjeudi 15 novembre 2007StatutMembreDernière intervention23 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 :) )
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 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
cs_leroukin
Messages postés36Date d'inscriptionjeudi 15 novembre 2007StatutMembreDernière intervention23 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.
cs_leroukin
Messages postés36Date d'inscriptionjeudi 15 novembre 2007StatutMembreDernière intervention23 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 !