VB6 et MultiThreading

Résolu
thyouston Messages postés 5 Date d'inscription mardi 5 septembre 2006 Statut Membre Dernière intervention 11 septembre 2006 - 11 sept. 2006 à 15:14
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 - 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.

5 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
11 sept. 2006 à 15:22
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 #
3
thyouston Messages postés 5 Date d'inscription mardi 5 septembre 2006 Statut Membre Dernière intervention 11 septembre 2006
11 sept. 2006 à 15:27
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...
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
11 sept. 2006 à 16:36
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é.
3
thyouston Messages postés 5 Date d'inscription mardi 5 septembre 2006 Statut Membre Dernière intervention 11 septembre 2006
11 sept. 2006 à 16:46
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
11 sept. 2006 à 17:00
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 #
0
Rejoignez-nous