Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/09/2011, 17h16   #1
Membre régulier
 
Guillaume
Inscription : décembre 2007
Messages : 161
Détails du profil
Informations personnelles :
Nom : Guillaume
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : décembre 2007
Messages : 161
Points : 91
Points : 91
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 :
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 :
1
2
3
Private Sub Commande0_Click()
    WaitFormLoad
End Sub
par celle-ci (form "_test2"):
Code :
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
Type de fichier : zip testsThread.zip (57,7 Ko, 10 affichages)
dut-dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 22h42   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 475
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 475
Points : 7 561
Points : 7 561
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.
marot_r est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2011, 10h29   #3
Membre régulier
 
Guillaume
Inscription : décembre 2007
Messages : 161
Détails du profil
Informations personnelles :
Nom : Guillaume
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : décembre 2007
Messages : 161
Points : 91
Points : 91
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 :
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
dut-dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2011, 13h31   #4
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 475
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 475
Points : 7 561
Points : 7 561
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.
marot_r est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h31.


 
 
 
 
Partenaires

Hébergement Web