[VB 2005] Optimisation [Résolu]

swan94 255 Messages postés jeudi 29 juillet 2004Date d'inscription 2 avril 2010 Dernière intervention - 9 sept. 2007 à 09:30 - Dernière réponse : swan94 255 Messages postés jeudi 29 juillet 2004Date d'inscription 2 avril 2010 Dernière intervention
- 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
cs_Willi 2381 Messages postés jeudi 12 juillet 2001Date d'inscription 13 février 2015 Dernière intervention - 9 sept. 2007 à 10:15
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é.

++

Merci cs_Willi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cs_Willi
Meilleure réponse
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 9 sept. 2007 à 13:03
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++

Merci BruNews 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de BruNews
cs_Willi 2381 Messages postés jeudi 12 juillet 2001Date d'inscription 13 février 2015 Dernière intervention - 9 sept. 2007 à 09:38
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
swan94 255 Messages postés jeudi 29 juillet 2004Date d'inscription 2 avril 2010 Dernière intervention - 9 sept. 2007 à 09:47
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
swan94 255 Messages postés jeudi 29 juillet 2004Date d'inscription 2 avril 2010 Dernière intervention - 9 sept. 2007 à 11:00
0
Merci
Je te remercie grandement pour ce lien. Je vais m'y mettre tout de suite.

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

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
swan94 255 Messages postés jeudi 29 juillet 2004Date d'inscription 2 avril 2010 Dernière intervention - 10 sept. 2007 à 09:27
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.