[VBA] utilisation de thread
En cherchant j'ai trouvé sur se site l'utilisation de theard. l'ennui c'est que cela me généré une erreure avant meme la fin de ce module.
Je vourais savoir comment palier a cette erreure qui est généré.
Merci
Voici le bout de code.
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
Private Sub Commande0_Click()
hThread = CreateThread(ByVal 0&, ByVal 0&, AddrOf("CallBackFunc"), _
ByVal 0&, ByVal 0&, hThreadID)
hThread2 = CreateThread(ByVal 0&, ByVal 0&, AddrOf("CallBackFunc2"), _
ByVal 0&, ByVal 0&, hThreadID2)
CloseHandle hThread 'ferme le handle
CloseHandle hThread2
Dim e As Long
e = TerminateThread(hThread, 0) 'ferme le thread
e = TerminateThread(hThread2, 0)
End Sub |
Access 2000 n'est pas "thread safe"
Bonjour,
D'après mon expérience sur ce sujet...
Citation:
Envoyé par
nemesys971
Est-il possible d'utiliser les thread pour lancer un formulaire progresssbar et en meme temps executer un module relativement long? Si ou comment parce que moi j'ai tester sans grand succes (gros plantage => erreure fatal)
Access 2000 (et XP-2002) n'est pas conçu pour permettre l'exécution de code dans des threads créés par l'utilisateur.
Techniquement, dans un contexte Access il est possible de créer des threads, mais avec de très lourdes contraintes: par exemple, la plupart des ressources (COM) créées sur un thread ne sont pas accessibles à partir d'un autre thread.
Autre exemple, ton thread ne doit pas créer des objets Access ni même y faire référence (un membre du forum a-t-il pu vérifier le contraire ?).
Donc, je te déconseille de manipuler des "objets Access" dans ton thread.
(ici "objets Access" = l'objet Application et tout ce qui s'y rattache, donc les formulaires, les états, feuilles de données, etc.)
Ce qui me semble possible:
- créer un thread "libre" qui exécute une procédure VBA, celle-ci agissant sur les données en utilisant sa propre instance de moteur de base de données (ou sa propre connexion),
- laisser Access gérer ses propres ressources dans ses threads (par exemple le formulaire avec la barre de progression),
- en cas de besoin de communication entre un thread Access et un thread "libre", utiliser les IPC de Windows (mailslot, pipe, mémoire partagée, events...),
- il est possible de partager une variable globale d'un module de code, mais seulement sur des types de données VBA (pas de référence à des objets),
- éviter au maximum l'utilisation de l'infrastructure COM à partir de ton thread (car la création de ton thread n'est pas conforme aux modalités de creation d'un thread prévu pour COM).
Autre chose: l'environnement de développement de VBA n'est pas conçu pour le multithreading. Donc, une fois ton thread "libre" démarré, tu n'as pas la possibilité de surveiller le bon déroulement de son exécution, ce qui complique singulièrement le débogage. :aie:
P.S. Oh la la... mais ce sujet a déjà plus de 2 ans !!! ;)
_