Bonjour/Bonsoir,
J'ai un problème dans mon programme, que je n'arrive pas à résoudre.
Le problème est le suivant :
J'aimerais évaluer dans une jauge la ram utilisé sur un pc distant.
Ni une ni deux, j'attaque le wmi via du vbs (si vous connaissez mieux, je suis preneur).
Tout fonctionne correctement jusque la, je récupere ma valeur de mémoire max, que je met en Jauge..BorneMax, puis ma valeur utilisé, que je met en valeur de Jauge.
Maintenant, je souhaite que ca se fasse en pseudo temps réél, c'est à dire en refresh automatique toute les 2/3 secondes.
Je lance donc une boucle de la forme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ########################################### POUR i = 0 A 10 CheckRAM("monserveur") // Fct qui verifie la RAM, et qui rempli les jauges Wait(200) // On attend 2 secondes pour recommencer, pour ne pas flooder de requetes FIN ###########################################
(j'ai fait un test sur 10 tours pour le moment, pour tester)
Tout fonctionne bien.
Pour un peu plus de clarté, voici ma fonction checkram()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 ########################################### PROCEDURE CheckRAM(sNamesrv1) nRAMuse est un entier = Get_RAM_used(sNamesrv1) // Check la RAM utilisé (valeur en Ko) nRAMmax est un entier = Get_RAM_full(sNamesrv1) // Check la RAM totale (valeur en Mo) SAI_NAME_1 = sNamesrv1 // Rempli un champs avec le nom machine J_RAM_1..BorneMax = nRAMmax/1000 // Defini la borne Max de la jauge J_RAM_1..Valeur = nRAMuse // Defini la borne Min de la jauge ###########################################
Ainsi que une des deux fonctions de checking, ici Get_RAM_used()
Voila pour les fonctions.
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 ########################################### PROCEDURE Get_RAM_used(SrvName) // objWMIService est un objet Automation "MSScriptControl.ScriptControl" // Initialise l'objet WMI ProgrammeVbs est une chaîne ResultatVbs est une chaîne // Le resultat // On écris tout le programme VBS (testé au préalable en environnement vbs standard) // ProgrammeVbs = "Function GetRam(SrvName)" + CRLF // ProgrammeVbs += "On Error Resume Next" + CRLF ProgrammeVbs += "strComputer = SrvName" + CRLF ProgrammeVbs += "strResult = " + Caract(34) + Caract(34) + CRLF ProgrammeVbs += "Set objWMIService = GetObject(" +Caract(34) + "winmgmts:\\" + Caract(34) + " & SrvName &" + Caract(34) + "\root\cimv2" + Caract(34) + ")" + CRLF ProgrammeVbs += "Set colItems = objWMIService.ExecQuery(" + Caract(34) + "SELECT * FROM Win32_OperatingSystem" + Caract(34) + ",,48)" + CRLF ProgrammeVbs += "For Each objItem in colItems" + CRLF ProgrammeVbs += "strResult = objItem.FreePhysicalMemory" + CRLF ProgrammeVbs += "Next" + CRLF ProgrammeVbs += "GetRam = strResult" + CRLF ProgrammeVbs += "End Function" objWMIService>>Language("VBScript") // On defini le language, ici du VBScript objWMIService>>Reset() // On reset le wmi WHEN EXCEPTION IN objWMIService>>AddCode(ProgrammeVbs) // On ecris le prog DO Erreur("Erreur dans le programme vbs.....") // Si une erreur à l'écriture, une box RENVOYER "" // Et on renvoi vide END ResultatVbs = "" WHEN EXCEPTION IN ResultatVbs = objWMIService>>Eval("GetRam("+Caract(34) +SrvName +Caract(34) +")") // On execute notre fonction DO Erreur("Erreur d'execution du programme vbs") // Si erreur, message RENVOYER "" // Et on renvoi vide END RENVOYER ResultatVbs // On renvoi la valeur de notre chere fonction ###########################################
Mon problème est le suivant.
Vu que je ne veux pas freezer ma fenetre principale en permanance, j'ai lancé mes fonctions dans un thread
séparé, avec un truc dans le style :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 ################################################# POUR i = 0 A 100 ThreadExécute("SrvInfo",threadNormal,Serveur1,"MonServeur") Wait(500) ThreadArrête("SrvInfo") Wait(100) FIN ###############################################
Et la, c'est le drame.
A prioris il ne me ferme pas bien mon script VBS, ou mon instance WMI, je ne sais pas bien.
Voici l'erreur :
#################################################
#################################################
Erreur à la ligne 15 du traitement Procédure locale Get_RAM_used.
L'objet automation 'MSScriptControl.ScriptControl' n'est pas installé sur votre système.
Informations techniques
Projet : InfoSrv
Dump de l'erreur du module <WD120VM.DLL> <12.01Cy>.
- Appel WL :
Traitement de <FEN_Fenêtre1.PROCEDURE.Get_RAM_used>, ligne <15>, thread <0>
- Niveau : erreur fatale (EL_FATAL)
- Code erreur : 2202
- Code erreur WD55 : 0
- Pas de code d'erreur système
- Pas de message d'erreur système
- Que s'est-il passé ?
L'objet automation 'MSScriptControl.ScriptControl' n'est pas installé sur votre système.
- Infos de debug :
__AlloueAutomation
- Infos attachées :
EIT_PILEWL :
Procédure locale Get_RAM_used (FEN_Fenêtre1.PROCEDURE.Get_RAM_used), ligne 15
Procédure locale Serveur1 (FEN_Fenêtre1.PROCEDURE.Serveur1), ligne 16
EIT_COMPOSANT :
EIT_DATEHEURE : 14/05/2009 16:54:56
- Identifiant dans le .err : 2202
Assistance
#################################################
#################################################
Or, cette erreur est totalement fausse, l'objet est bien installé sur mon système, preuve en est, sans thread ca
fonctionne très bien.
De plus, le premier tour de boucle fonctionne parfaitement, c'est au second qu'il s'emmele les pinceaux.
Avez vous une solution à me proposer, ou un début de piste ?
Cordialement.
Folcan
Partager