[VB 2005] Optimisation [Résolu]

Messages postés
255
Date d'inscription
jeudi 29 juillet 2004
Dernière intervention
2 avril 2010
- - Dernière réponse : swan94
Messages postés
255
Date d'inscription
jeudi 29 juillet 2004
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
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
2382
Date d'inscription
jeudi 12 juillet 2001
Dernière intervention
15 décembre 2018
3
Merci
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é.

++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_Willi
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
3
Merci
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++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de BruNews
Messages postés
2382
Date d'inscription
jeudi 12 juillet 2001
Dernière intervention
15 décembre 2018
0
Merci
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 :)
Commenter la réponse de cs_Willi
Messages postés
255
Date d'inscription
jeudi 29 juillet 2004
Dernière intervention
2 avril 2010
0
Merci
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
Commenter la réponse de swan94
Messages postés
255
Date d'inscription
jeudi 29 juillet 2004
Dernière intervention
2 avril 2010
0
Merci
Je te remercie grandement pour ce lien. Je vais m'y mettre tout de suite.

Swan94
Commenter la réponse de swan94
Messages postés
255
Date d'inscription
jeudi 29 juillet 2004
Dernière intervention
2 avril 2010
0
Merci
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
Commenter la réponse de swan94
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
DoEvents est un pis aller, ça ralentit énormément les traitements.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
255
Date d'inscription
jeudi 29 juillet 2004
Dernière intervention
2 avril 2010
0
Merci
ok merci de vos conseils. Vous méritez vraiment votre statut d'admin cs.

Cordialement,

Swan94
Commenter la réponse de swan94

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.