VB6 et MultiThreading [Résolu]

thyouston 5 Messages postés mardi 5 septembre 2006Date d'inscription 11 septembre 2006 Dernière intervention - 11 sept. 2006 à 15:14 - Dernière réponse : cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention
- 11 sept. 2006 à 17:00
Bonjour,

Pour situer, je débute complètement en developpement.
J'essaye de developper un outil de supervision à moindre frais.
Je bloque au niveau du developpement de l'agent à déployer sur les postes clients. Je n'arrive pas à lancer plusieurs requetes WMI simultanément et en temps réel.

J'ai essayé différentes solutions de multi-threading mais je tombe régulièrement sur des soucis d'exception WIN32 (j'ai lu que c'était du au fait que le l'utilisation de boucles et autres fonctions utilisées également le runtime).
J'ai essayé le DoEvents ou une solution palliative trouvée sur ce site mais le résultat est le même.

Voici le code:

Sub Main()
    Dim eventCount, e As Integer
    'on lit dans le fichier ini
    eventCount = CInt(LireINI("SearchForEvent", "searches"))
    If eventCount <> 0 Then
        Do While True
            For e = 1 To eventCount
                SearchEvent (e)
            Next
        Loop
    End If
End Sub


Private Sub SearchEvent(ByVal NbrEvent As Integer)
'fonction qui va chercher l'evenement
    Dim objWMIService, objEvents, objLatestEvent As Object
    Dim notifMail, NotifMessage, RunScript As Boolean
    Dim namespace, targetInstance, eventClass As String

    'on appelle toutes les requetes renseignées dans le fichier ini
     namespace = LireINI("Event" & NbrEvent, "NameSpace")
     targetInstance = LireINI("Event" & NbrEvent, "TargetInstance")
     eventClass = LireINI("Event" & NbrEvent, "EventClass")
        
     Set objWMIService = GetObject("winmgmts:" _
            & "{impersonationLevel=impersonate}!\\." & namespace)
       
        'on renseigne la requete WMI
     Set objEvents = objWMIService.ExecNotificationQuery _
     ("SELECT * FROM " & eventClass & " within 1 WHERE TargetInstance ISA '" & targetInstance & "'" & EnumCondition(NbrEvent))
        
        Set objLatestEvent = objEvents.NextEvent
        If Not objLatestEvent Is Nothing Then
            'on verifie si des notifications ont été paramétrées
            notifMail = CBool(LireINI("Event" & NbrEvent, "NotifMail"))
            NotifMessage = CBool(LireINI("Event" & NbrEvent, "NotifMessage"))
            RunScript = CBool(LireINI("Event" & NbrEvent, "RunScript"))
            If notifMail = True Then
            SendMail (NbrEvent)
            End If
            If NotifMessage = True Then
            SendMessage (NbrEvent)
            End If
            If RunScript = True Then
            UseScript (NbrEvent)
            End If
        End If
        Set objEvents = Nothing
        Set objLatestEvent = Nothing
        Set objWMIService = Nothing

End Sub

si vous aviez des propositions pour pouvoir lancer plus d'une recherche simultanément, je serai heureux et ravi de les essayer pour vous.
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 11 sept. 2006 à 15:22
3
Merci
Le seul conseil que je peux te donner, c'est d'oublier le multithreading en VB6. Il sait pas faire.

Même les plus expérimentés ont beaucoup de mal à l'utiliser.
Et les programmes ainsi créer ne sont que très très rarement stables.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #

Merci cs_casy 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 84 internautes ce mois-ci

Commenter la réponse de cs_casy
Meilleure réponse
thyouston 5 Messages postés mardi 5 septembre 2006Date d'inscription 11 septembre 2006 Dernière intervention - 11 sept. 2006 à 15:27
3
Merci
merci de ta reponse, c'est effectivement un peu ce que j'ai lu un peu partout. Il n'y a donc aucun interet a essayer Thread Factory par exemple?


Comment faire alors pour lancer 2 functions avec un parmetre different en temps reel? Meme avec un raisonnement sequentiel je bloque...

Merci thyouston 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 84 internautes ce mois-ci

Commenter la réponse de thyouston
Meilleure réponse
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 11 sept. 2006 à 16:36
3
Merci
Non le multithreading est instable sous l'IDE de vb6, mais en mode compilé, normalement, c'est aussi stable qu'un appli développée en C++, je dit en théorie car perso, je m'y suis jamais penché.

Merci cs_DARKSIDIOUS 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 84 internautes ce mois-ci

Commenter la réponse de cs_DARKSIDIOUS
thyouston 5 Messages postés mardi 5 septembre 2006Date d'inscription 11 septembre 2006 Dernière intervention - 11 sept. 2006 à 16:46
0
Merci
ben en fait ca ne marche ni sous l'IDE ni en compilé. Mais quand je fais un deboggage pas à pas, j'ai au moin l'erreur: en l'occurence, il me dit que ma requete WMI n'est pas resolvable alors qu'elle fonctionne sans aucun souci si je retire les fonctions de multi-threading.
Commenter la réponse de thyouston
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 11 sept. 2006 à 17:00
0
Merci
Je ne dis pas que mon expérience vaut cas général, loin de là, je ne me considère pas comme un grand chef de la prog.

Néanmoins, le multithreading en VB6 , je n'ai jamais réussi à le faire marcher, sous l'ide ou en compilé. Les symtomes ? les jours ou ça allait c'était exception, ou vb qui se fermait sans rien dire, mais la plupart du temps c'était le sympatique BSOD

J'avais réussi à le faire en VB5, semble-t-il un peu plus tolérent en la matière. Mais ce qui semblait marché, finissait par planté au bout de quelques heures de fonctionnements continu.

Bref j'ai déporté ton mon code sensible en C dans une dll, et moyennant quelques précautions pource genre de travail, j'ai réussi à faire ce que j'avais besoin.

Conclusion pour moi : Multithreading et VB "classique", on y pense même pas.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Commenter la réponse de cs_casy

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.