IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Lancer mon formulaire d'attente (ProgressBar) dans un thread


Sujet :

VBA Access

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut Lancer mon formulaire d'attente (ProgressBar) dans un thread
    Bonjour,

    J'ai construit un formulaire d'attente à partir du tutoriel d'Arkham : http://arkham46.developpez.com/artic...s/formattente/

    Lorsque j'essaie de l'utiliser Dans certaines procédures, j'ai des requêtes assez lourdes qui mettent du temps à s'exécuter. Malheureusement pendant ce temps là, mon formulaire ne se rafraichit pas et l'animation est figée (comme s'il y a avait un plantage).

    Je souhaiterais donc lancer ce formulaire dans un thread qui lui permettrait de se rafraichir indépendamment de l'exécution de mes requêtes.

    J'ai donc effectué le travail suivant :

    la procédure WaitFormLoad() qui ouvre un formulaire d'attente à partir du module de classe d'Arkham :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Public Sub WaitFormLoad()
        Dim oProgress As clProgress
        Dim lCptIteration1 As Long
        Dim lCptIteration2 As Long
        Dim lString As String
        Const lNbIterations As Long = 4000
     
        ' Ouverture et initialisation d'un formulaire d'attente (instance de la classe clProgress)
        Set oProgress = New clProgress                                          'ici on appelle la classe clProgress (voir module de classe correspondant)
        oProgress.ProgressMin = 1                                               'on attribue des valeurs aux propriétés de la classe clProgress (sinon on utilisera les valeurs par défaut trouvée dans la procédure Initialize() de la classe correspondante)
        oProgress.ProgressMax = lNbIterations                                   '...
        oProgress.ProgressValue = 0                                             '...
        oProgress.GeneralInfo = "Veuillez patienter durant le traitement ... "  '...
        oProgress.AnimationPrefix = "ImgFrame"                                  '...
        oProgress.AnimationTimer = 500                                          'Lance l'animation des images (voir clProgress)
        oProgress.Visible = True                                                '...
     
        ' Boucle de traitement
        For lCptIteration1 = 1 To lNbIterations
            For lCptIteration2 = 1 To 1000
                lString = Chr((lCptIteration1 + lCptIteration2) Mod 256)
            Next
     
            oProgress.ProgressValue = lCptIteration1                                                        ' Met à jour la progression (voir la propriété correspondante dans la classe clProgress)
            oProgress.ProgressInfo = "Traitement en cours ... " & Format(oProgress.ProgressPercent, "00%")  ' Met à jour l'étiquette (voir la propriété correspondante dans la classe clProgress)
            oProgress.Repaint                                                                               ' Repeint le formulaire (voir la propriété correspondante dans la classe clProgress)
     
            'oProgress.Repaint2 lCptIteration1, "Traitement en cours ... " & Format(oProgress.ProgressPercent, "00%"), "Données Articles"                              ' Repeint le formulaire d'attente (voir la procédure correspondante dans la classe clProgress)
     
        Next
     
        Set oProgress = Nothing                                                 'destruction de l'objet oProgress de classe clProgress (=Fermeture du formulaire)
    Exit Sub
     
    Gestion_Erreurs:
        If err.Source = "clProgress" Then       'Traitement spécifique pour les erreurs survenues dans la classe clProgress
            Debug.Print "Erreur dans le traitement n° " & err.Number & " de la classe " & err.Source & " : " & err.Description
            Resume Next                         'Puis on continue le traitement
        Else
            MsgBox "Erreur dans le traitement n° " & err.Number & ", " & err.Description, vbCritical
        End If
        Set oProgress = Nothing                 'destruction de l'objet oProgress de classe clProgress (=Fermeture du formulaire)
     
    End Sub
    Dans mon formulaire "_test" j'ai remplacé la procédure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Commande0_Click()
        WaitFormLoad
    End Sub
    par celle-ci (form "_test2"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Commande0_Click()
        hThread = CreateThread(ByVal 0&, ByVal 0&, AddressOf WaitFormLoad, ByVal 0&, ByVal 0&, hThreadID)
        CloseHandle hThread 'ferme le handle
        Dim e As Long
        e = TerminateThread(hThread, 0) 'ferme le thread
    End Sub
    Résultat : le formulaire d'attente s'ouvre parfois mais ne va jamais au bout de la ProgressBar et Access se ferme "sauvagement"...!?

    Je vous laisse consulter la base exemple en pièce jointe.
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Il n'y a pas de Thread en Access mais voici une discussion sur le même sujet.

    http://www.developpez.net/forums/d11...ep-call-faire/

    On obtient un résultat équivalent sans utiliser une programmation complexe.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut
    Bonjour,
    Avant de poster j'avais fais une recherche sur le forum, cette discussion ne répond pas à mon problème.
    Lorsque le traitement d'une instruction est trop long, mettre un DoEvents avant ou après ne change rien. Dans l'exemple ci-dessous le formulaire d'attente se fige pendant la durée d'exécution de la requête. C'est précisément ce que je souhaiterais éviter en plaçant mon formulaire dans un thread qui continuerait de s'actualiser de manière indépendante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        ...
        DoEvents
        DoCmd.RunSQL "MaRequete", -1
        DoEvents
        ...
    Plus généralement, l'idée de pouvoir exécuter certaines procédure en arrière-plan m'intéresse particulièrement.
    http://access.developpez.com/sources...acc#creaThread

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Ok, une autre idée serait d'ouvrir une autre instance d'Access et de mettre le formulaire d'attente dans cette instance. Le multi-tasking serait alors fait par le système.

    Mais je suis d'accord avec toi, avoir des threads en Access serait intressant. Je suis curiuex de voir où cette discussion va mener.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

Discussions similaires

  1. [Toutes versions] Formulaire d'attente (progressbar) et export excel
    Par robin148 dans le forum VBA Access
    Réponses: 9
    Dernier message: 08/08/2014, 12h16
  2. Réponses: 3
    Dernier message: 11/03/2010, 09h05
  3. ProgressBar dans un Thread
    Par kelkar dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/08/2007, 11h30
  4. Label et progressbar dans formulaire
    Par jean-pierre96 dans le forum IHM
    Réponses: 2
    Dernier message: 03/05/2006, 12h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo