Application en Service

Scorpio974 Messages postés 19 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 17 septembre 2007 - 12 sept. 2007 à 09:41
NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 - 17 sept. 2007 à 09:35
Bonjour !

J'ai créer une application en VB, mais j'aimerais le
transformer en Service pour que le programme s'éxécute automatiquement
sans intervention de l'utilisateur.


Mon programme récupére le taux d'utilisation du CPU, la capacité.. des
disques durs installés, écrit ces informations dans un fichier et
l'envoit par ftp sur une machine qui traite les informations pour faire
des graphs, envoi d'alertes etc...


J'aimerais que le programme s'éxécute toutes les X minutes afin d'avoir un suivi de l'ordinateur en question.


Pourriez-vous m'aider à faire ce service svp ? :)


 Merci d'avance pour vos réponses !

21 réponses

NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 159
14 sept. 2007 à 08:51
Bonjour

Pour la transformée en service, il dfaut que tu créé un nouveau projet de type service (pas dispo sur les versions Express) et ensuite tu récupère ton code et tu l'adapte (regarde MSDN pour cela).

Pour l'analyse à intervalle réguliers, tu utilise un thread (atttention à la manipultaion, pense à une méthode pour l'arrêter quand Windows le demanderas à ton service) puis un code du genre :

Private Sub SubThread()
    Dim lLastTick as integer
   
    do while mCanRun 'Pour dire au thread s'il peut continuer à tourner
        'Ici on attend 60 secondes (soit 60000ms) ou un effet de bord du TickCount de la machine pour lancer Le sub qui est appelée donc à interval d'environs 1 minutes (pas précis, mais suffisant)
        if Environment.TickCount+60000> lLastTick or lLastTick>Environment.TickCount Then
            SubAppeleeAInterValRegulier 'Nom de la Sub à appeler
            lLastTick=Environment.TickCount
        Else
            System.Threading.Thread.Sleep(100) 'Une petite pause de 100ms
        End if
    Loop
End Sub

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
Scorpio974 Messages postés 19 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 17 septembre 2007
14 sept. 2007 à 09:56
Bonjour !

Merci de m'avoir répondu :)

En fait, j'ai utiliser un Timer réservé pour les services. J'ai testé et ça fonctionne correctement sur mon PC. Mais (oui, il y a toujours un mais), j'ai essayé sur un autre PC et ça ne fonctionne pas, du moins, pas complètement.

En effet, dans mon code, j'ai ceci :

Dim file2 As System.IO.StreamWriter
            file2 = My.Computer.FileSystem.OpenTextFileWriter("c:\TEST" & pc_name(1), True)
            file2.WriteLine(Message)
file2.Close()

pc_name étant une variable que j'ai récupéré dans un fichier texte avec :

 Dim fic As StreamReader = New StreamReader("c:\TEST\fichier_conf") 'Ouvre le fichier c:\TEST\fichier_conf
            Dim fic_ligne As String

            fic_ligne = fic.ReadToEnd

            ' Délimite des champs par les RETOUR CHARIOT dans le fichier c:\TEST\fichier_conf pour stocker le nom du serveur dans une variable
            Champs = Split((fic_ligne), vbCrLf)

            'Prend le deuxième mot du 4è champ
            pc_name = Split(Champs(4), )
fic_close()

Tout ça, me permet d'écrire dans un fichier. Sur mon pc, il écrit bien sur le fichier etc.. mais sur l'autre, il fait rien. Pas d'écriture etc... Par contre, il effectue les copies :

If Dir$("c:\TEST" & pc_name(1)) <> vbNullString Then
                FileCopy("c:\TEST\fichier_conf, "c:\TEST\backup" & pc_name(1) & "_" & Now.Month & "-" & Now.Year & ".sav")
End If

Donc, je ne pense pas que c'est un problème d'autorisation NTFS :s

Une idée ?
0
Scorpio974 Messages postés 19 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 17 septembre 2007
14 sept. 2007 à 10:01
J'ai fait des erreurs en recopiant dans le dernier code :

If Dir$("c:\TEST" & pc_name(1)) <> vbNullString Then
FileCopy("c:\TEST" & pc_name(1), "c:\TEST\backup" & pc_name(1) & "_" & Now.Month & "-" & Now.Year & ".sav")
EndIf

Pour info, tous les framework sont installés sur les 2 pcs, et je supprime bien le fichier avant ré-écriture avec :

My.Computer.FileSystem.DeleteFile("c:\IseosViewer" & serveur(1))
0
Scorpio974 Messages postés 19 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 17 septembre 2007
14 sept. 2007 à 10:11
Dsl pour ce triple-post, mais ça pourra peut-être aider. Voici l'erreur que j'ai lorsque je lance mon programme avec mon Application sur le 2ème PCS :

See the end of this message for details on invoking

just-in-time (JIT) debugging instead of this dialog box.


************** Exception Text **************

System.IO.FileLoadException: Le volume ne contient pas de système de
fichiers connu. Vérifiez si tous les pilotes de système de fichiers
nécessaires sont chargés et si le volume n'est pas endommagé.
(Exception from HRESULT: 0x800703ED)

at Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet(Object o,
Type objType, String name, Object[] args, String[] paramnames,
Boolean[] CopyBack)

at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object
Instance, Type Type, String MemberName, Object[] Arguments, String[]
ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)

at IseosApplicationViewer.IseosApplication.Button1_Click(Object sender, EventArgs e)

at System.Windows.Forms.Control.OnClick(EventArgs e)

at System.Windows.Forms.Button.OnClick(EventArgs e)

at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)

at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)

at System.Windows.Forms.Control.WndProc(Message& m)

at System.Windows.Forms.ButtonBase.WndProc(Message& m)

at System.Windows.Forms.Button.WndProc(Message& m)

at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)

at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)

at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************

mscorlib

Assembly Version: 2.0.0.0

Win32 Version: 2.0.50727.832 (QFE.050727-8300)

CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll

----------------------------------------

IseosApplicationViewer

Assembly Version: 1.0.0.0

Win32 Version: 1.0.0.0

CodeBase: file:///C:/IseosApplicationViewer.exe

----------------------------------------

Microsoft.VisualBasic

Assembly Version: 8.0.0.0

Win32 Version: 8.0.50727.42 (RTM.050727-4200)

CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Microsoft.VisualBasic/8.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll

----------------------------------------

System

Assembly Version: 2.0.0.0

Win32 Version: 2.0.50727.832 (QFE.050727-8300)

CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll

----------------------------------------

System.Windows.Forms

Assembly Version: 2.0.0.0

Win32 Version: 2.0.50727.832 (QFE.050727-8300)

CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll

----------------------------------------

System.Drawing

Assembly Version: 2.0.0.0

Win32 Version: 2.0.50727.832 (QFE.050727-8300)

CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll

----------------------------------------

System.Runtime.Remoting

Assembly Version: 2.0.0.0

Win32 Version: 2.0.50727.832 (QFE.050727-8300)

CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Runtime.Remoting/2.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll

----------------------------------------

CustomMarshalers

Assembly Version: 2.0.0.0

Win32 Version: 2.0.50727.42 (RTM.050727-4200)

CodeBase: file:///C:/WINDOWS/assembly/GAC_32/CustomMarshalers/2.0.0.0__b03f5f7f11d50a3a/CustomMarshalers.dll

----------------------------------------


************** JIT Debugging **************

To enable just-in-time (JIT) debugging, the .config file for this

application or computer (machine.config) must have the

jitDebugging value set in the system.windows.forms section.

The application must also be compiled with debugging

enabled.


For example:


<configuration>

<system.windows.forms jitDebugging="true" />

</configuration>


When JIT debugging is enabled, any unhandled exception

will be sent to the JIT debugger registered on the computer

rather than be handled by this dialog box.
0

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

Posez votre question
NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 159
14 sept. 2007 à 10:54
Bonjour

Déjà une remarque :

If Dir$("c:\TEST" & pc_name(1)) <> vbNullString Then

Ne fais pas très Framwork, utilises plutot :
If Io.File.Exists("c:\TEST" & pc_name(1))Then

Pour l'exception, j'ai juste regardé la 1ière ligne :

System.IO.FileLoadException: Le volume ne contient pas de système de
fichiers connu. Vérifiez si tous les pilotes de système de fichiers
nécessaires sont chargés et si le volume n'est pas endommagé.
(Exception from HRESULT: 0x800703ED)

Fais un scandisk de ton PC (si windows XP, la ligne de commande suivante te permettras de voir mieux les erreurs :
chkdsk /f/v/r Lecteur:

Puis regarde dans les évenements des applications (Gestion de l'ordi) pour voir les résultat si redémarrage, sinon tu verra cela dans la ligne de commande (que te conseil de lancer à partir de cmd).
)

Tu ne force pas le démontage, il te faudras peut-être redémarrer l'ordinateur, si tu as un gros DD, tu peux prendre quelquess caféss et même plus.

Voilà pour la premiètre constatation

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 159
14 sept. 2007 à 10:57
Bonjour

Dans la ligne :
Dim fic As StreamReader = New StreamReader("c:\TEST\fichier_conf") 'Ouvre le fichier c:\TEST\fichier_conf
            Dim fic_ligne As String

            fic_ligne = fic.ReadToEnd

            ' Délimite des champs par les RETOUR CHARIOT dans le fichier c:\TEST\fichier_conf pour stocker le nom du serveur dans une variable
            Champs = Split((fic_ligne), vbCrLf)

            'Prend le deuxième mot du 4è champ
            pc_name = Split(Champs(4), ) 'Manque pas quelque chose ?
fic_close()

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 159
14 sept. 2007 à 10:58
Bonjour

Je reprends ta phrase :
Désolé pour le triple post

Quel est le code qui pose pb ?

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
Scorpio974 Messages postés 19 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 17 septembre 2007
14 sept. 2007 à 11:13
J'ai remplacé ce qui ne faisait pas trop framework :)
0
Scorpio974 Messages postés 19 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 17 septembre 2007
14 sept. 2007 à 11:26
J'ai "réparer" le disque avec la commande, j'ai enlever la variable pc_name(1) pour la remplacer par test, mais c'est toujours pareil sur le 2è pc, alors que sur le premier ça fonctionne très bien :(

Dim file2 As System.IO.StreamWriter
            file2 = My.Computer.FileSystem.OpenTextFileWriter("c:\TEST\test"), True)
            file2.WriteLine(Message)
file2.Close()

J'comprends pas pourquoi
0
NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 159
14 sept. 2007 à 11:36
Bonjour

Pour le split, tu split sur quoi ?
Sinon, dans ma quête de faire le + framwork possible :
' Délimite des champs par les RETOUR CHARIOT dans le fichier c:\TEST\fichier_conf pour stocker le nom du serveur dans une variable
            Champs = Split((fic_ligne), vbCrLf)

            'Prend le deuxième mot du 4è champ
            pc_name = Split(Champs(4), )
Devient
' Délimite des champs par les RETOUR CHARIOT dans le fichier c:\TEST\fichier_conf pour stocker le nom du serveur dans une variable
            Champs = fic_ligne.Split(vbCrLf)

            'Prend le deuxième mot du 4è champ
            pc_name = Champs(4).Split(" "c)

si j'ai bien suivit : l'exception est liée à ton pb .
System.IO.FileLoadException: Le volume ne contient pas de système de
fichiers connu. Vérifiez si tous les pilotes de système de fichiers
nécessaires sont chargés et si le volume n'est pas endommagé.
(Exception from HRESULT: 0x800703ED)

J'en conclu que tu doit avoir un problème bien plus en amont de ton code.

Tu as essayé en utilisant un exe seul aulieu du service ?

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
Scorpio974 Messages postés 19 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 17 septembre 2007
14 sept. 2007 à 12:39
Split, ça permet de délimiter des champs non ? Ben En tout cas, pc_name récupère bien le nom de l'ordi dans le fichier :)

Sinon, ce message, je l'obtiens en lançant mon application justement, car si je lance le service, je n'ai rien en retour :s Et ça fonctionne sur le pc où j'ai créer le programme et pas sur un autre xp que j'ai sous la main (d'ici ce soir, je pourrais tester sur un autre pc, en espérant que ce soit bon :s)

Tu veux voir mon code pour voir les éventuelles erreurs ?
0
NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 159
14 sept. 2007 à 12:43
Bonjour

Oui, la fonction Click qui pose pb.

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
Scorpio974 Messages postés 19 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 17 septembre 2007
14 sept. 2007 à 13:07
J'ai transféré mon application sur un Windows Vista.

La première fois ça a fonctionné :

DISK 1 OK; Utilisation du disque 1 C: Espace total: 8,0 Go - Espace disponible: 0,4 Go - Pourcentage occupe: 94,44 - Pourcentage libre: 5,56; |disk_use=94
CPU CRITIQUE; Utilisation du CPU = 99%; |cpu_use=99
MEM OK; Utilisation de la memoire Physique = 56,6536203522505 % de 1022 Mo; |mem_use=56,6536203522505

Mais la seconde fois j'ai une erreur :

La valeur était trop grande ou trop petite pour un Decimal.

Consultez la fin de ce message pour plus de détails sur l'appel du débogage
juste-à-temps (JIT) à la place de cette boîte de dialogue.

************** Texte de l'exception **************
System.OverflowException: La valeur était trop grande ou trop petite pour un Decimal.
   à System.Decimal..ctor(Double value)
   à Microsoft.VisualBasic.CompilerServices.Conversions.ToDecimal(Object Value, NumberFormatInfo NumberFormat)
   à Microsoft.VisualBasic.CompilerServices.Conversions.ToDecimal(Object Value)
   à IseosApplicationViewer.IseosApplication.Button1_Click(Object sender, EventArgs e)
   à System.Windows.Forms.Control.OnClick(EventArgs e)
   à System.Windows.Forms.Button.OnClick(EventArgs e)
....
....
....

Je pense que c'est la variable de la mémoire, j'vais modifier ça pour voir ;)
0
Scorpio974 Messages postés 19 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 17 septembre 2007
14 sept. 2007 à 13:16
J'ai modifié pour avoir un int pour la mémoire, mais même erreur à la duxième execution, voici mon code (de débutant) :

Imports
System

Imports
System.IO

 

Structure
MEMORYSTATUS

    Dim dwLength AsInteger

    Dim dwMemoryLoad AsInteger

    Dim dwTotalPhys AsInteger

    Dim dwAvailPhys AsInteger

    Dim dwTotalPageFile AsInteger

    Dim dwAvailPageFile AsInteger

    Dim dwTotalVirtual AsInteger

    Dim dwAvailVirtual AsInteger

EndStructure

 

PublicClass InfoAppli

 

    PrivateSub
Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load

 

    EndSub

 

    PublicSub
Button1_Click(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles
Button1.Click

 

        If IO.File.Exists("c:\TEST\server_config") = FalseThen' Vérifie que le fichier server_config existe avant de
continuer

            MsgBox("Créer
un fichier 'server_config' dans c:\TEST contenant les informations,
nécessaires" & vbCrLf & "pour
une connection ftp, séparées par des simples retour-chariot (Entrée)"
& vbCrLf & vbCrLf & "Exemple à
respecter: " & vbCrLf & vbCrLf & "adresse_ftp" & vbCrLf & "nagios_user" & vbCrLf & "nagios_password" & vbCrLf & "lcd c:\TEST" & vbCrLf & "put fichier_à_envoyer" & vbCrLf
& "quit", MsgBoxStyle.Critical,
"Fichier 'serveur config' introuvable dans
c:\TEST")

            ' Stopper
le service

        Else

            'Déclaration des
variables | le programme commence

            Dim Champs() AsString

            Dim serveur() AsString

            Dim etat_cpu AsString

            Dim etat_mem AsString

            Dim mem_use AsDecimal

            Dim etat_disk AsString

            Dim cpu_use AsDecimal

            Dim disk_use AsString

 

            Dim fic As
StreamReader = New StreamReader("c:\TEST\server_config") 'Ouvre le fichier c:\TEST\server_name

            Dim fic_ligne AsString

 

           
fic_ligne = fic.ReadToEnd

 

            ' Délimite des
champs par les tabulations dans le fichier c:\TEST\server_config pour stocker
le nom du serveur dans une variable

            Champs = Split((fic_ligne), vbCrLf)

            serveur = Split(Champs(4), )

 

            ' Si le
dossier backup n'existe pas, le créer

 

            If IO.File.Exists("c:\TEST\backup")
= FalseThen

                My.Computer.FileSystem.CreateDirectory("c:\TEST\backup")

            EndIf

 

            ' Crée un
backup du dernier état

 

            If IO.File.Exists("c:\TEST"
& serveur(1)) Then

                FileCopy("c:\TEST" & serveur(1), "c:\TEST\backup" & serveur(1) & "_" & Now.Month & "-" & Now.Year & ".sav")

            EndIf

 

            '
Supprime le fichier contenant les informations du serveur si il existe afin de
le recréer

            If IO.File.Exists("c:\TEST"
& serveur(1)) Then

                My.Computer.FileSystem.DeleteFile("c:\TEST" & serveur(1))

            EndIf

 

            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

            '
Récupération état des disques ET Ecriture dans le fichier '

            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

 

            '
Inventaire lecteurs

            Dim
total_disk AsString

            Dim
dispo_disk AsString

            Dim
prct_occ AsString

            Dim
prct_dispo AsString

            Dim
prct_occ_graph AsInteger

            Dim fso, d, dc

            Dim i = 1

            Dim message2 AsString

            fso
= CreateObject("Scripting.FileSystemObject")

            dc =
fso.Drives

 

            ForEach d In dc

                SelectCase
d.DriveType

                   
Case 2

 

                       
' Conversion de la taille totale en Go : division par 1073741824
(1024x1024x1024)

                        ' Conversion de la taille totale en Mo : division par 1048576
(1024x1024)

 

                        total_disk = "Espace total: "
& FormatNumber(d.TotalSize / 1024 / 1024 / 1024, 1) & " Go"

                       
dispo_disk = "Espace disponible: "
& FormatNumber(d.AvailableSpace / 1024 / 1024 / 1024, 1) & " Go"

                       
prct_occ = "Pourcentage occupe: "
& FormatNumber(((d.TotalSize - d.AvailableSpace) / d.TotalSize) * 100, 2)

                       
prct_dispo = "Pourcentage libre: "
& FormatNumber((d.AvailableSpace / d.TotalSize) * 100, 2)

                       
disk_use = total_disk & " - "
& dispo_disk & " - " &
prct_occ & " - " &
prct_dispo

 

                       
'Graphique

                        prct_occ_graph =
FormatNumber(((d.TotalSize - d.AvailableSpace) / d.TotalSize) * 100, 2)

 

                        ' Etat des disques :

                        If FormatPercent(d.AvailableSpace / d.TotalSize, 0) < "20%"Then

                            etat_disk = "ATTENTION"

                       
Else

                            If FormatPercent(d.AvailableSpace / d.TotalSize, 0)
< "10%"Then

                                etat_disk = "CRITIQUE"

                            Else

                                If FormatPercent(d.AvailableSpace / d.TotalSize, 0)
>= "20%"Then

                                    etat_disk =
"OK"

                                EndIf

                            EndIf

                       
EndIf

 

                       
message2 = message2 & vbCrLf & "DISK
" & i & " "
& etat_disk & "; Utilisation du disque
" & i & " "
& d.DriveLetter & ": "
& disk_use & "; |disk_use="
& prct_occ_graph

                       
' Ecriture dans le fichier config à envoyer

                        i = i + 1 'Si plusieurs disques

                    CaseElse

 

                EndSelect

 

            Next

 

            Dim file As
System.IO.StreamWriter

            file
= My.Computer.FileSystem.OpenTextFileWriter("c:\TEST" & serveur(1), True)

            file.WriteLine(message2)

           
file.Close()

 

            fic.Close()

 

 

            '
--------------------- FIN RECUPERATION ETAT DISQUE ---------------------

 

            ''''''''''''''''''''''''''''''''

            '
Récupération état du CPU

            ''''''''''''''''''''''''''''''''

 

            Dim strTempFile = "c:\TEST\cputime.temp"'Name of the temp file

 

            Const ForReading = 1

            Const ForWriting = 2

 

            Dim objService = GetObject("Winmgmts:{impersonationlevel=impersonate}!\Root\Cimv2")

            Dim objLastCheck, objInstance, N1, D1

            Dim N2, D2, objLastCheckWrite

            Dim objFSO ', objFile

           
objFSO = CreateObject("Scripting.FileSystemObject")

 

            If
objFSO.FileExists(strTempFile) Then'Le fichier temp existe t-il ?

 

ancre:

 

                ' On
récupère le pourcentage du processeur du fichier temporaire

                objLastCheck
= objFSO.OpenTextFile(strTempFile, ForReading)

                N1
= objLastCheck.Readline

               
D1 = objLastCheck.Readline

                objLastCheck.Close()

 

                ' On
récupère le pourcentage du processeur et on l'écrit dans le fichier temporaire

                objInstance = objService.Get("Win32_PerfRawData_PerfOS_Processor.Name='_Total'")

                N2 =
objInstance.PercentProcessorTime

                D2 = objInstance.TimeStamp_Sys100NS

                objLastCheckWrite =
objFSO.OpenTextFile(strTempFile, ForWriting, True)

                objLastCheckWrite.WriteLine(N2)

               
objLastCheckWrite.WriteLine(D2)

                objLastCheckWrite.Close()

 

 

                '
Calcul de l'utilisation du CPU

                cpu_use
= (1 - ((N2 - N1) / (D2 - D1))) * 100

                cpu_use = Int(cpu_use)

 

                ' Etat du CPU en
fonction du taux d'utilisation

                If cpu_use < "80"Then

                   
etat_cpu "CPU OK; Utilisation du CPU
" & cpu_use & "%"

                Else

                   
If cpu_use > "90"Then

                       
etat_cpu
"CPU CRITIQUE; Utilisation du CPU "
& cpu_use & "%"

                    Else

                       
If cpu_use >= "80"Then
                            etat_cpu "CPU ATTENTION; Utilisation du CPU "
& cpu_use & "%"

                       
EndIf

                   
EndIf

                EndIf

            Else

                ' Si
le fichier temp n'existe pas, on écrit dans le fichier temp

                objInstance = objService.Get("Win32_PerfRawData_PerfOS_Processor.Name='_Total'")

                N2 =
objInstance.PercentProcessorTime

                D2 = objInstance.TimeStamp_Sys100NS

                objLastCheckWrite =
objFSO.OpenTextFile(strTempFile, ForWriting, True)

                objLastCheckWrite.WriteLine(N2)

               
objLastCheckWrite.WriteLine(D2)

                objLastCheckWrite.Close()

                GoTo
ancre 'On va à ancre (plus haut)

 

            EndIf

 

            '
--------------------- FIN RECUPERATION ETAT CPU ---------------------

 

 

            '''''''''''''''''''''''''''''''''''

            '
Récupération état de la mémoire

            '''''''''''''''''''''''''''''''''''

 

            Dim Memoire As
MEMORYSTATUS

            Dim MemLibre AsInteger

            Dim MemTotal AsInteger

           
GlobalMemoryStatus(Memoire)

           
MemTotal = Int(Memoire.dwTotalPhys / 1024 / 1024)

           
MemLibre = Int(Memoire.dwAvailPhys / 1024 / 1024)

 

           
mem_use = Int((MemLibre * 100) / MemTotal)

 

 

            If mem_use < "80"Then
                etat_mem "MEM OK; Utilisation de la memoire Physique "
& mem_use & " % de " &
MemTotal & " Mo"

            Else

                If
mem_use > "90"Then
                    etat_mem "MEM CRITIQUE; Utilisation de la memoire Physique
" & mem_use & " % de "
& MemTotal & " Mo"

                Else

                    If
mem_use >= "80"Then
                        etat_mem "MEM ATTENTION; Utilisation de la memoire Physique
" & mem_use & " % de "
& MemTotal & " Mo"

                    EndIf

                EndIf

            EndIf

 

 

            '
--------------------- FIN RECUPERATION ETAT CPU ---------------------

 

 

            ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

            'On écrit
l'état du CPU et l'état de la mémoire dans le fichier à envoyer

            ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

 

            Dim Message AsString

 

           
Message = etat_cpu & ";
|cpu_use=" & cpu_use & vbCrLf & etat_mem & "; |mem_use=" & mem_use & vbCrLf

 

            Dim file2 As
System.IO.StreamWriter

            file2
= My.Computer.FileSystem.OpenTextFileWriter("c:\TEST" & serveur(1), True)

            file2.WriteLine(Message)

           
file2.Close()

 

            ' Envoie du
fichier par ftp :

            'Call
Shell("ftp -i -s:c:\TEST\server_config", AppWinStyle.Hide)

 

            RichTextBox1.Text
= message2 & vbCrLf & Message & vbCrLf

 

        EndIf

 

    EndSub

 

 

 

    EndClass

 
0
NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 159
14 sept. 2007 à 14:11
Bonjour

Bon à la vue de ton code, tu es en .NET1 ou 2 (2003 ou 2005) ?

car en .NET2, tu as My.Computer.FileSystem (si je m'en rappel bien).

Cela t'évite de passer par FSO ce qui est plus propre et plus rapide.

Je rajoute une question, as-tu tenter de mettre un point d'arrêt (en mode Debug) en haut de ta Sub Button1_Click pour faire une analyse en pas à pas ?
Quand tu as l'exception, tu t'arrête où ?

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 159
14 sept. 2007 à 14:13
Bonjour

Met dans les propriétés de ton projet :
Option Strict à On
et
Option Explicit à On

Tu verras peutêtre une erreur.

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
Scorpio974 Messages postés 19 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 17 septembre 2007
16 sept. 2007 à 13:17
Bonjour !

Désolé de répondre aussi tardivement, mais j'étais assez occupé.

Demain, je testerai ce que tu m'as répondu, car là je ne suis pas sur le bon poste, j'te tiendrai au courant :P

Merci pour ton aide ! C'est sympa ;)
0
Scorpio974 Messages postés 19 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 17 septembre 2007
17 sept. 2007 à 08:20
Alors, j'ai remplacé les FSO, maintenant il n'y a que du My.computer.FileSystem dedans :)

J'ai essayé le debug pas à pas, et j'ai rencontré la même erreur que lrosque j'éxécute sur l'autre PC. L' erreur se trouve ici :

            ''''''''''''''''''''''''''''''''
            ' Récupération état du CPU
            ''''''''''''''''''''''''''''''''

            Dim strTempFile = "c:\IseosViewer\cputime.temp" 'Name of the temp file
            Dim cpu_use As Integer
            Dim objService = GetObject("Winmgmts:{impersonationlevel=impersonate}!\Root\Cimv2")
            Dim objInstance
            Dim N1, N2, D1, D2

ancre:

            If IO.File.Exists(strTempFile) Then

                ' On récupère le pourcentage du processeur du fichier temporaire

                Dim temp As System.IO.StreamReader
                temp = My.Computer.FileSystem.OpenTextFileReader(strTempFile)
                N1 = temp.ReadLine
                D1 = temp.ReadLine
                temp.Close()

                ' On récupère le pourcentage du processeur et on l'écrit dans le fichier temporaire
                objInstance = objService.Get("Win32_PerfRawData_PerfOS_Processor.Name='_Total'")
                 N2 = objInstance.PercentProcessorTime
                D2 = objInstance.TimeStamp_Sys100NS

                If IO.File.Exists(strTempFile) Then
                    My.Computer.FileSystem.DeleteFile(strTempFile)
                End If

                Dim temp2 As System.IO.StreamWriter
                temp2 = My.Computer.FileSystem.OpenTextFileWriter(strTempFile, True)
                temp2.WriteLine(N2 & vbCrLf & D2)
                temp2.Close()

                ' Calcul de l'utilisation du CPU
                cpu_use = Int((1 - ((N2 - N1) / (D2 - D1))) * 100)

                ' Etat du CPU en fonction du taux d'utilisation
                If cpu_use < 80 Then                    etat_cpu "CPU OK; Utilisation du CPU " & cpu_use & "%"
                Else
                    If cpu_use > 90 Then                        etat_cpu "CPU CRITIQUE; Utilisation du CPU " & cpu_use & "%"
                    Else
                        If cpu_use >= 80 Then                            etat_cpu "CPU ATTENTION; Utilisation du CPU " & cpu_use & "%"
                        End If
                    End If
                End If
            Else
                ' Si le fichier temp n'existe pas, on écrit dans le fichier temp
                objInstance = objService.Get("Win32_PerfRawData_PerfOS_Processor.Name='_Total'")

                N2 = objInstance.PercentProcessorTime
                D2 = objInstance.TimeStamp_Sys100NS

                Dim temp2 As System.IO.StreamWriter
                temp2 = My.Computer.FileSystem.OpenTextFileWriter(strTempFile, True)
                temp2.WriteLine(N2 & vbCrLf & D2)
                temp2.Close()

                GoTo ancre 'On va à ancre (plus haut)

            End If

            ' --------------------- FIN RECUPERATION ETAT CPU ---------------------

Je pense que c'est au niveau des déclarations que ça coince ou lors de la récupération dans le fichier texte ?

Parce que j'ai enlevé ce bout de code, j'ai générer la solution, et j'ai excéuté sur l'autre PC et ça fonctionne bien. Je vais donc chercher une autre façon de récuperer le taux d'utilisation du CPU parce que, écrire dans un fichier texte etc.. c'est pas très propre :s

Tu aurais un ptit code à me proposer ? :)
0
NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 159
17 sept. 2007 à 08:30
Bonjour

Désolé, mais WMI, c'est pas mon rayon. Maintenant que tu sais où ça coince, tu peux aller plus loin et éventuellement poser la question plus précise sur le forum pour que les autres la voit.

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
Scorpio974 Messages postés 19 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 17 septembre 2007
17 sept. 2007 à 09:27
Okay ;) Merci beaucoup pour ton aide !

J'ai trouvé (en fouillant dans l'aide) quelque chose pour récupérer la mémoire, bien plus facile que GlobalMemoryStatus :/ :

My.Computer.Info.TotalPhysicalMemory ou My.Computer.Info.AvailablePhysicalMemory etc...

Plus rapide et plus "propre" :) De plus je peux récupérer la mémoire virtuelle etc.. :P Si j'avais su avant ^^

Tu sais comment envoyer un fichier par ftp ? (Car pour l'instant, j'utilise le ftp de Windows en f aisant un call shell). J'ai pas envie que ce soit "trop" compliqué ou trop lourd. Remarque, le call shell fonctionne très bien :p Mais je ne sais pas si le fichier a été bien envoyé (pas de retour d'erreur etc...).

Voilà voilà, encore merci de m'avoir aider ;)
0
Rejoignez-nous