Barre de progression - Optimisation temps/mémoire utile

Hello forum,

Voici le code d'une barre de progression qui fonctionne très bien. Seulement, il consomme beaucoup de temps en affichage.

En effet, un programme qui s'exécute tout seul en 20 minutes met plus de 2h45 minutes dès qu'on introduit une barre de progression dans chaque boucle.

Je cherche une manière de "gagner" du temps d'exécution. Que faire de la gestion de mémoire? Comment font-ils chez WINDOWS pour compresser leurs délais? Il est vrai que les application qui utilisent VBA en support de nos éditeurs internes au boulot, tournent beaucoup plus vite, tout en affichant une barre de tâche.

Comment font ils? Des idées, je suis preneur

Mon code:

Sub P2(c As Long, n As Long, d As Integer)
    'c est le numéro de la ligne parcourue - compteur
    'n est la ligne d'arrivée
    'd est la ligne de départ 
    Dim m As Long
    U.Top = 350
    U.Left = 450
    U.Height = 120
    m = U.Barre_1.Width - 4

    U.Barre_2.Width = ((c - d + 1) / (n - d + 1)) * m
    U.Label1.Caption = "Progression:  " & Int(100 * (c - d + 1) / (n - d + 1)) & "%"

    Application.ScreenUpdating = True

    If ((c - d + 1) / (n - d + 1)) * 100 = 100 Then
        U.Height = 150
        Application.Wait (Now() + TimeValue("00:00:03"))
        Unload U
    End If
End Sub

Merci d'avance.

Bonjour,

Comment font-ils chez WINDOWS pour compresser leurs délais?

Ecris ton code en VB.Net, C# ou C++ ou autre langage compilé et tu verras la différence !

VBA est du code interprété ce qui veut dire que le compilateur lit ligne par ligne donc bien plus long que du code VB.Net ou C# etc... qui une fois compilé est en langage machine ce qui élimine des couches d'interprétations et donc, qui réduit fortement le temps d'exécution.

Plus tu rajoutes de lignes de code, plus tu ralentis l'exécution complète, plus tu rajoutes de phases de calculs plus tu ralentis :

U.Barre_2.Width = ((c - d + 1) / (n - d + 1)) * m
U.Label1.Caption = "Progression:  " & Int(100 * (c - d + 1) / (n - d + 1)) & "%"

Et bien sûr, le meilleur pour la fin :

Application.Wait (Now() + TimeValue("00:00:03"))

Tu demandes au compilateur de faire une pause de 3 secondes à chaque appel de la Sub() !

Tu peux trouver VB.Net Express qui est gratuit et concevoir une Dll où sera ou seront stockées tes fonctions que tu pourras appeler depuis Excel, le langage sera compilé et donc, plus rapide d'exécution.

Voici le code d'une barre de progression qui fonctionne très bien. Seulement, il consomme beaucoup de temps en affichage.

Si tu veux observer l'avancement sans nuire à la performance, essaye alors :
Application.StatusBar = "Lecture de ... " & n & " sur " & total

et à la fin

Application.StatusBar = False  'Liberation...

Bonjour Theze,

Merci pour ces précieuses informations. Je vais tenter de faire comme tu as dis.

Yeshua.

Bonjour Steelson,

Je ne connaissais pas l'instruction application.statusbar jusque là. Enfin je l'ai vu passer sans jamais l'avoir utilisée. Je ne savais donc pas ce qu'elle faisait. Je vais tenter cette proposition aussi, elle peut être un bon compromis.

Yeshua.

Tu demandes au compilateur de faire une pause de 3 secondes à chaque appel de la Sub() !

J'avoue, c'est un peu normal. Mais de toute façon en enlevant cette ligne, j'ai gagné que 50 minutes (ce qui est déjà énorme c'est vrai) sur l'exécution totale de 2h45. Cest déjà ça.

J'ai justé préféré tout enlever, le temps de tester ta proposition Theze. Et en optimisant encore mieux, je réduis mon code à 10 minutes maintenant.

Yeshua.

Bonbjour,

Passer de 2h45 à 10 mn je pense que tu as vraiment optimiser ton code maintenant, il te sera possible de gratter encore quelques minutes mais je ne pense pas que tu puisses passer sous la seconde mais c'est bien, tu as pus voir que plus il y a de lignes à lire et à exécuter pour le compilateur, plus ça met de temps !

Tu peux, comme te le propose Steelson , par exemple, juste mettre dans la barre d'état Application.StatusBar = '"Traitement en cours, veuillez patienter..." et ensuite supprimer le message avec Application.StatusBar = False, il est vrai que peu d'utilisateurs regarde la barre d'état mais bon !

Rechercher des sujets similaires à "barre progression optimisation temps memoire utile"