[VB 2005] Optimisation

Résolu
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 2 avril 2010 - 9 sept. 2007 à 09:30
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Derniè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.

Merci d'avance pour votre aide.

Swan94

8 réponses

cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
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é.

++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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

ciao...
BruNews, MVP VC++
3
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
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 :)
0
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Derniè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
0

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

Posez votre question
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 2 avril 2010
9 sept. 2007 à 11:00
Je te remercie grandement pour ce lien. Je vais m'y mettre tout de suite.

Swan94
0
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Derniè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.

Qu'en penses-tu ?

Swan94
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 sept. 2007 à 08:36
DoEvents est un pis aller, ça ralentit énormément les traitements.

ciao...
BruNews, MVP VC++
0
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 2 avril 2010
10 sept. 2007 à 09:27
ok merci de vos conseils. Vous méritez vraiment votre statut d'admin cs.

Cordialement,

Swan94
0
Rejoignez-nous