swan94
Messages postés254Date d'inscriptionjeudi 29 juillet 2004StatutMembreDernière intervention 2 avril 2010
-
9 sept. 2007 à 09:30
swan94
Messages postés254Date d'inscriptionjeudi 29 juillet 2004StatutMembreDernière intervention 2 avril 2010
-
10 sept. 2007 à 09:27
Salut à tous,
Je suis confronté à un petit souci de lenteur, je ne dois surement pas faire comme il faut.
J'ai un module qui va me prendre 90000 caractères au hasard. Je lui fait afficher la progression dans une progressbar située sur un form.
Seul problème est qu'il me prend plus de 5 min pour me générer ces caractères.
D'après mes tests, cela est dut à la mise à jour de la progressbar. Comment puis-je faire pour optimiser au mieux pour que l'actualisation de la progressbar ne ralentisse pas l'évolution de cette génération.
cs_Willi
Messages postés2375Date d'inscriptionjeudi 12 juillet 2001StatutModérateurDernière intervention15 décembre 201822 9 sept. 2007 à 10:15
Effectivement séparer l'UI de tes traitements est mieux, par ailleurs je te conseille d'aller jeter un oeil sur cet article sur le BackgroundWorker qui est à mon sens bien décortiqué.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 9 sept. 2007 à 13:03
Avant de fouiller du BackgroundWorker ou autre, on réfléchit sur ce qu'on code.
Boucle de 90000 tours, qu'y fait "If int_i = 0 Then" alors qu'il se produira qu'1 seule fois au début. Mets cette ligne avant la boucle et tu gagneras 90000 sauts de code.
int_i / 89753 * 100 , calculer 2 fois une lourde opération est du contre productif absolu.
Pourrait donner un truc de ce genre (syntaxe à vérifier):
with form1
.RichTextBox2.Text = Chr(Int(pvt_rdm_al.Next(48, 122)))
valdbl = 0
For int_i = 1 To 90000
.RichTextBox2.Text = .RichTextBox2.Text & Chr(Int(pvt_rdm_al.Next(48, 122)))
valdbl += 0.00111416888572
With frmAvancement
.pbTraitement.Value = Math.Round(valdbl)
.lblTraitementPct.Text = Math.Round(valdbl, 2) & "%"
.Update()
.Refresh()
End With
Next
End with
cs_Willi
Messages postés2375Date d'inscriptionjeudi 12 juillet 2001StatutModérateurDernière intervention15 décembre 201822 9 sept. 2007 à 09:38
Bonjour,
Au lieu d'actualise la progression de ta progressbar à chaque caractère fais la par 100. ou alors revoit ton générateur de caractères aléatoires :)
swan94
Messages postés254Date d'inscriptionjeudi 29 juillet 2004StatutMembreDernière intervention 2 avril 2010 9 sept. 2007 à 09:47
je te remercie pour cette réponse rapide ;) (on voit vraiment la signification du terme "communauté" au sein de ce forum c'est appréciable).
voilà mon code :
with form1
For int_i = 0 To 90000
If int_i = 0 Then
.RichTextBox2.Text = Chr(Int(pvt_rdm_al.Next(48, 122)))
Else
.RichTextBox2.Text = .RichTextBox2.Text & Chr(Int(pvt_rdm_al.Next(48, 122)))
End If
With frmAvancement
.pbTraitement.Value = Math.Round(int_i / 89753 * 100)
.lblTraitementPct.Text = Math.Round(int_i / 89753 * 100, 2) & "%"
.Update()
.Refresh()
End With
Next
End with
J'ai penser à l'utilisation d'un thread via background worker mais j'avoue ne pas réussir à le faire.
Comment devrais-je optimiser ?
Swan94
Vous n’avez pas trouvé la réponse que vous recherchez ?
swan94
Messages postés254Date d'inscriptionjeudi 29 juillet 2004StatutMembreDernière intervention 2 avril 2010 10 sept. 2007 à 00:22
Merci Brunews tu as tout à fait raison. Mais en fait c'est qu'au début j'ai eu un problème avec un fichier texte j'avais pensé que c'était dû à un espace au début enfin bref c'est un oubli de ma part. Cependant j'ai utilisé la même méthode que tu indiques sans le update ni le refresh mais en utilisant le doevents qui m'a apporter beaucoup de souplesse (tout en restant loin de celle du background worker). Maintenant l'utilisateur peut cliquer et déplacer les formulaires, ca ne fait plus planter l'affichage.