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 :

[VBA] utilisation de thread


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 78
    Points : 28
    Points
    28
    Par défaut [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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Quelle est ta version d'Access, le code source stipule bien que AddrOf est pour les versions <= 97
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 78
    Points : 28
    Points
    28
    Par défaut
    moi j'ai une version 2000

    et comment on va vers une version 2000

  4. #4
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    il faut utiliser AddressOf comme cela est expliqué dans le code

    ça fonctionnera peut être mieux ...
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 78
    Points : 28
    Points
    28
    Par défaut
    Et je le récupere ou?

    Parce que je ne le trouve pas

  6. #6
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    AddressOf est une fonction native d'Access 2000 au même titre que Left() ou autre ...

    Donc dans ton cas, commence par essayer de remplacer AddrOf par AddressOf ... c'est plus clair ?
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  7. #7
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 78
    Points : 28
    Points
    28
    Par défaut
    Ok je te remercie

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 78
    Points : 28
    Points
    28
    Par défaut
    lors que je met AddressOf il me marque une erreure. et lorsque je lance le programme avec AddrOf il passe sauf que peu apres une erreure "fatal" fait que la base "saute"

  9. #9
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Salut,

    Essaye :
    sans parenthèse, sans guillemet il ne devrait pas y avoir d'erreur de syntaxe

    Si ça plante toujours mets nous plus de code....

  10. #10
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 78
    Points : 28
    Points
    28
    Par défaut
    merci

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 78
    Points : 28
    Points
    28
    Par défaut
    j'ai toujours du mal avec les thread.

    j'ai copier le code disppo sur les thread de ce site j'ai remplacer les AddrOf par des AddressOf mais la encore souci (je n'arrive meme pas a faire tourner le code qui se trouve sur le site dans une base de données).

    l'adresse de la page se trouve : http://access.developpez.com/sources...acc#creaThread


    a cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Call GetCurrentVbaProject(hProject)
    GetCurrentVbaProject est une fonction et lorsque je place une variable il retourne 0 quand meme.
    Il ne passe jamais dans le if.

    Est-ce que quelqu'un pourrais m'aider merci.

  12. #12
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    pour access 2000 :
    - tu vires les trois déclarations qui font appel à la librairie "vba332.dll"
    - tu vires la fonction AddrOf
    - tu remplaces AddrOf("CallBackFunc") par AddressOf CallBackFunc

  13. #13
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 78
    Points : 28
    Points
    28
    Par défaut
    donc dans mon module on trouve :
    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
     
    Public i, i2 As Integer
    Public hThread As Long, hThreadID As Long
    Public hThread2 As Long, hThreadID2 As Long
     
    '** Déclaration API pour reproduire fonction AddressOf
    Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    Public Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long
     
    Public Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
    Public Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
     
     
    Public Function CallBackFunc() As Long
    i = i + 1
    CallBackFunc = i
    End Function
     
    Public Function CallBackFunc2() As Long
    i2 = i2 + 2
    CallBackFunc2 = i2
    End Function

    Dans mon module il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub Commande0_Click()
    hThread = CreateThread(ByVal 0&, ByVal 0&, AddressOf CallBackFunc, ByVal 0&, ByVal 0&, hThreadID)
    hThread2 = CreateThread(ByVal 0&, ByVal 0&, AddressOf 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

    lorsque je lance mon prog il ne va pas dans mes fonctions (CallBackFunc, CallBackFunc2) et renvoi un chiffre aléatoire.

  14. #14
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Tu ne peux pas affecter de valeur à tes fonctions CallBack, c'est windows qui leur donne une valeur en fonction du bon déroulement de la fonction.

    De toute façon je ne vois pas où tu compterais récupérer cette valeur?

  15. #15
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 78
    Points : 28
    Points
    28
    Par défaut
    c'est juste mais comment ca se fais que je ne le vois pas passer dans la fonction?

  16. #16
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 78
    Points : 28
    Points
    28
    Par défaut
    Et pour les versions d'access 2002 on note quoi?

  17. #17
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 78
    Points : 28
    Points
    28
    Par défaut
    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)

  18. #18
    Candidat au Club
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Petite precision
    Je crois qu'il est preferable d'utiliser la fonction ExitThread plutot que TerminateThread et ceci pour des questions de liberations de ressources allouees.
    La fonction TerminateThread, comme indique dans le MSDN est a uiliser en dernier recours !!!

    Si j'ai pu faire avancer les choses !
    Bonne continuation

  19. #19
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Access 2000 n'est pas "thread safe"
    Bonjour,

    D'après mon expérience sur ce sujet...
    Citation Envoyé par nemesys971 Voir le message
    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.

    P.S. Oh la la... mais ce sujet a déjà plus de 2 ans !!!
    _

  20. #20
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 78
    Points : 28
    Points
    28
    Par défaut
    Oups... Que de négligeance...

    C'est que mon poste est plutot vieux.

    Mais merci pour ces réponses. qui m'ont aidés et qui m'aide toujours.
    (Porjet de thread abandonné en 2006 mais repris en 2008)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA] utiliser une macro contenue dans un autre classeur
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 01/02/2006, 18h46
  2. [VBA]Utiliser les objet disponible d'un programme en VB
    Par seblefebvre dans le forum Général VBA
    Réponses: 13
    Dernier message: 01/02/2006, 10h34
  3. [EXCEL][VBA] Utilisation des formules Excel en VBA
    Par Amanck dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/12/2005, 15h08
  4. Utilisation des threads
    Par Valinor dans le forum Linux
    Réponses: 2
    Dernier message: 30/11/2005, 16h41
  5. Utilisations des Threads
    Par phoenix440 dans le forum Réseau
    Réponses: 15
    Dernier message: 21/08/2005, 17h19

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