Image GIF qui se fige temporairement [Résolu]

Signaler
Messages postés
93
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
28 juin 2020
-
Messages postés
93
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
28 juin 2020
-
Bonjour à tous !

J'ai une appli qui charge à partir d'une base Access une grille. Il y a environ 8.000 enreg. dans la base. Pour faire patienter l'utilisateur, j'ai codé dans la forme primaire lors du Load Form un contrôle WebBrowser nommé wb avec le code :

Form1.wb.Visible = True
Form1.wb.Navigate App.Path & "\attente4.gif"


Le fichier GIF suivant s'affiche et est animé :

Mais lorsque je lance le remplissage de la grille, l'animation ne se fait plus et se réanime à la fin du chargement (env. 8sec). Le code de remplissage est le suivant :

Public Sub fill_grille()
On Error GoTo bug_fill:
Form1.bt_search.Enabled = False
Form1.bt_maj.Enabled = False
Set tb = db.OpenRecordset("SELECT * FROM mots ORDER BY mots ASC")

Form1.wb.Visible = True                          ' <------------------- init webbrowser
Form1.wb.Navigate App.Path & "\attente4.gif"        '  <----------- show GIF
DoEvents

tb.MoveFirst
With Form1.grille
.Clear
.Rows = 2
.Row = 0
nbre_mots = 0
lec:
Do Until tb.EOF
        .RowHeight(.Row) = 300 * tb("nombre")
    .Col = 0
    .Text = tb("mots")
    .CellAlignment = FlexAlignmentLeftCenter
    .Col = 1
    .Text = tb("auteur")
    .Text = Replace(.Text, "/", vbCrLf)
    .Col = 2
    .Text = tb("page")
    .Text = Replace(.Text, "/", vbCrLf)
    .Col = 3
    .Text = tb("nombre")
    .Rows = .Rows + 1
    .Row = .Row + 1
    nbre_mots = nbre_mots + 1 ' tb("nombre")
tb.MoveNext
'
Loop
fini_loop:
Form1.zone_mots = nbre_mots
Form1.bt_search.Enabled = True
Form1.bt_maj.Enabled = True
.Rows = .Rows - 2
Form1.Visible = True
Form1.MousePointer = vbArrow
End With
Form1.wb.Visible = False              ' <------- masquer webbroser
Exit Sub
bug_fill:
MsgBox Error
db.Close
End

End Sub


Avez-vous une idée pourquoi l'animation se fige dans cette procédure mais se réactive une fois finie ? Le but étant de faire patienter l'utilisateur avec une petite animation.

Merci d'avance

Notpa

7 réponses

Messages postés
2191
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
9 août 2020
111
Bonsoir
Je pense que ton Doevents est mal placé : il doit être à l'intérieur de la boucle Do Loop pour rendre la main au système et permettre à l'animation de continuer .
De plus inutile de mettre Form1.XXXXX où XXXX est la suite du code si tout ce code est dans Form1 ( à vérifier car VB6 est loin pour moi )
DE plus les étiquette lec: et fini_loop: ne servent pas dans le code . Autant mettre un commentaire
Public Sub fill_grille()

     On Error GoTo bug_fill:
     bt_search.Enabled = False
     bt_maj.Enabled = False
     Set tb = db.OpenRecordset("SELECT * FROM mots ORDER BY mots ASC")
     wb.Visible = True                          ' <------------------- init webbrowser
     wb.Navigate App.Path & "\attente4.gif"        '  <----------- show GIF
     '  DoEvents  inutile ici
     tb.MoveFirst 
     With grille
        .Clear
        .Rows = 2
        .Row = 0
        nbre_mots = 0
        ' boucle lecture
        Do Until tb.EOF
            .RowHeight(.Row) = 300 * tb("nombre")
            .Col = 0
            .Text = tb("mots")
            .CellAlignment = FlexAlignmentLeftCenter
            .Col = 1
            .Text = tb("auteur")
            .Text = Replace(.Text, "/", vbCrLf)
            .Col = 2
            .Text = tb("page")
            .Text = Replace(.Text, "/", vbCrLf)
            .Col = 3
            .Text = tb("nombre")
            .Rows = .Rows + 1
            .Row = .Row + 1
            nbre_mots = nbre_mots + 1 ' tb("nombre")
            tb.MoveNext
            DoeEvents ' ici il est utile le DoEvents
        Loop
        ' fin boucle
        zone_mots = nbre_mots
        bt_search.Enabled = True
        bt_maj.Enabled = True
        .Rows = .Rows - 2
        Visible = True
        .MousePointer = vbArrow
   End With
   wb.Visible = False              ' <------- masquer webbrowser
   Exit Sub
bug_fill:
   MsgBox Error
   db.Close
  End

End Sub


Messages postés
93
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
28 juin 2020
1
Bonsoir vb95 et merci de ton aide.

En effet, le DoEvents était mal placé. Une fois dans la boucle Do, ce qui est logique, l'animation se fait. Mais le temps de chargement de la grille met 60sec au lieu de 6sec ! Pas possible.

Pour Form1.xxx, c'est requis. Les contrôles définis dans Form1 ne sont pas accessibles directement dans la procédure appelée par Call fill_grille. Si je ne mets pas la forme d'appartenance, j'ai une erreur : Variable non définie.

Quand aux labels, ce n'est pas ça qui gêne. C'est un reliquat de divers tests effectués et supprimés depuis.

Donc, si j'ai bien compris, je n'ai que 2 choix : ou l'image reste figée et le remplissage de la grille met 6sec, ou le GIF s'anime, mais le temps de chargement est mutiplié par 10 environ !

Note que j'ai fait des tests avec un barre de progression, j'en arrive aux mêmes résultats.
Messages postés
2191
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
9 août 2020
111
Bonsoir
1) Pour le DoEvents c'est bien ça
2) Pour Form1 j'avais bien spécifié si le code est dans Form1 . Or je pense que le code est dans un module ou une autre Form ouverte une fois Form1 ouverte .
3) Des Labels ce sont des contrôles que l'on pose sur la Form . On parle d'étiquette de ligne lorsque ceci désigne des endroits dans le code pour des branchements Goto ou On Error Goto . ainsi cela évite la confusion .
4) Oui tu as bien compris : ou c'est le remplissage de la grille en 6 secondes ou c'est le Gif animé avec ce remplissage mais en 60 secondes . L'animation en VB 6 est gourmande en temps processeur à mon avis . Pourquoi ne pas mettre une ProgressBar à la place du Gif ? Celle-ci suivrait l'évolution du chargement de la base de données par bloc de 100 enregistrements et tous les 100 enregistrements tu augmente la valeur de la ProgressBar de 1 ( la ProgressBar ayant comme Minimum 0 et comme Maximum 80 ( une valeur entière ) par exemple soit nombre total d'enregistrements divisé par 100 . Et tu laisses l'image Gif fixe .
Quant à la réponse de JeuDuTaquin que je salue je ne peux pas confirmer ou pas : VB6 est trop loin pour moi ( plus de 10 ans )

Ou alors peut-être mettre le Gif Animé dans un Thread et le chargement de la base de données dans un autre Thread . Je sais le faire en VB Net mais pas du tout en VB 6 .
Messages postés
177
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
12 mai 2020
5
Salut Notpa,
As-tu essayé de faire une setfocus sur l'objet WebBrowser, au debut de la form de remplissage…?
Messages postés
93
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
28 juin 2020
1
Bonjour à tous !

@vb95 :

1 - OK
2 - désolé, j'ai oublié de spécifier que la procédure fill_grille est dans un module, pas dans la form, d'où l'obligation de préciser la form concernée
3 - Lapus ! Je ne sais pas pourquoi mais une vieille réminiscence de mes débuts en informatique (il y a +50 ans !) qui étaient en langage COBOL sur mainframe IBM. Dans ce langage, une étiquette s'appelle... Label ! D'où mon lapsus. Pourquoi ce bond en arrière ???
4 - j'ai déjà testé avec une barre de progression. La valeur max était fixée par la valeur du RecordCount de la table et la progression de 1. Ce qui provoquait avec un DoEvents un temps de réponse long et souvent un freeze de la barre de progression avant la fin de remplissage de la grille (vers 3000, 4000 ou 5000).
Mais au lieu de faire une seule progression, je vais faire comme tu le suggères une progression 'cyclique', c'est à dire boucler de 1 à 100 jusqu'à la fin du chargement de la grille.
Laisse-moi le temps de coder ça et je reviens.

@JeuDuTaquin

Désolé, mais SetFocus ne change rien.

Merci à vous, bonne journée et à bientôt !

Notpa
Messages postés
93
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
28 juin 2020
1
Bon. Les tests sont concluants. J'ai laissé tomber le GIF et utilisé une ProgressBar nommée pb à l'intérieur d'une Frame. Le code est le suivant:
En début de proc Fill_grille :

Form1.Frame1.Visible = True
Form1.Frame1.Refresh
Form1.pb.Visible = True
Form1.pb.Refresh
Form1.pb.Max = 1000
Form1.pb.Min = 0
Form1.pb.Value = 0
x = 0


Dans la boucle Do qui charge la grille :

If x < 1000 Then
    Form1.pb.Value = Form1.pb.Value + 1
    x = x + 1
    Else
    x = 1
    Form1.pb.Max = 1000
    Form1.pb.Min = 0
    Form1.pb.Value = 0
End If


Et en fin de proc :

Form1.zone_mots = nbre_mots
Form1.Frame1.Visible = False
Form1.pb.Visible = False


Remarquez que je n'ai pas utilisé DoEvents. La barre de progression évolue très bien, de manière cool. Le temps passe de 7sec à 12sec, ce qui est tout à fait acceptable par rapport au GIF animé avec DoEvents qui durait 60sec !

Je passe donc ce sujet en résolu et vous remercie encore 1000 fois de vos conseils.

Au plaisir

Notpa
Messages postés
2191
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
9 août 2020
111
bonsoir
Je vois que tu n'utilises pas le
With    End With


Ton bout de ton code
A chaque ligne tu vas chercher Form1 et pour les 5 dernières lignes avec pb c'est pareil
Form1.Frame1.Visible = True
Form1.Frame1.Refresh
Form1.pb.Visible = True
Form1.pb.Refresh
Form1.pb.Max = 1000
Form1.pb.Min = 0
Form1.pb.Value = 0
x = 0


on le transforme
On va chercher Form1 une seule fois ainsi que Frame1 et pb : un peu plus rapide
With Form1
      With Frame1
          .Visible = True
          .Refresh
      End with
     With pb
         .Visible = True
         .Refresh
         .Max = 1000
         .Min = 0
         .Value = 0
     End With
End With
x = 0

Comme tu vois le With ...... End with peut être imbriqué

Autre chose : prends l'habitude de donner un nom significatif à tes variables ;
 x = 0
c'est quoi x ? C'est une inconnue comme les maths ? Donne lui un nom de variable plus parlant en rapport avec son rôle . si dans 6 mois tu dois reprendre une partie du code tu t'y retrouveras bien mieux !

tu as écrit : "Je passe donc ce sujet en résolu" . Fais le alors avec le bouton adéquat ( il est assez gros lol ! )
Messages postés
93
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
28 juin 2020
1
Re,

Si, j'utilise souvent les With/End With. Regarde mon post initial : il est utilisé. Mais il est vrai que dans ma routine de progression, j'aurai pu le coder.

Pour la variable x, tous mes programmes utilisent cet indice (Integer) comme variable dans mes calculs. Je n'ai aucun souci pour me souvenir de son utilisation. C'est une variable mathématique, tout comme le y que j'utilise aussi. Question d'habitude.

Tu dis :"tu as écrit : "Je passe donc ce sujet en résolu" . Fais le alors avec le bouton adéquat ( il est assez gros lol ! ) "

Mais, c'est ce que j'ai fait ! Il est marqué Résolu, non ?
Messages postés
2191
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
9 août 2020
111
Excuses-moi car tu as dû le marquer en résolu alors que moi j'étais encore sur la page Internet de Codes-Sources avec ton post . Du coup la page ne s'est pas mise à jour .
Pour le With c'est juste : tu l'as utilisé dans ton post initial .
Deux fois désolé !
Messages postés
93
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
28 juin 2020
1
Pas grave ! Tu m'as aidé, c'est le principal !

Bonne soirée !