[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
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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