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

VB.NET Discussion :

Application en Service


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 56
    Par défaut Application en Service
    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 !

  2. #2
    Membre Expert Avatar de LaChips
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 109
    Par défaut
    Bonjour,
    Je pense qu'il faudrait créer pour cela un nouveau projet : Service Windows

    Sinon vous pouvez utiliser le planificateur de tâches de Windows afin que votre programme se lance toutes les X minutes

  3. #3
    Membre averti
    Inscrit en
    Août 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 56
    Par défaut
    Salut,

    Oui, mais en créant un projet : Service Windows, il faut quand même une commande pour que ça boucle toutes les X minutes, car pour l'instant je suis obligé d'appuyer sur un bouton pour que le programme effectue les commandes, or j'aimerais que ce soit fait automatiquement.

    Oui, le planificateur de tâches pourrait-être une solution, mais est-ce qu'il est actif même quand aucune session n'est ouverte ? Et je crois de plus, que ce n'est pas possible de planifier toutes les X minutes avec le planificateur de Windows, en effet, je n'ai que ces options :
    Tous les jours
    Toutes les semaines
    Tous les mois
    Une seule fois
    Au démarrage de mon ordinateur
    A l'ouverture d'une session
    Voili voilou

    --

    T'es de Supinfo ? Moi aussi, Supinfo Océan Indien.

  4. #4
    Membre averti
    Inscrit en
    Août 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 56
    Par défaut
    J'ai réussi à faire un service qui fonctionne a moitié

    En fait, voilà ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Do
     
    'Mon programme
     
    System.Threading.Thread.Sleep(30000) '= pause de 30 secondes
     
    Loop
    Pourquoi ça fonctionne à moitié, et ben parce que, quand je lance le service, ça prend pas mal de temps, ensuite il me dit que le processus n'a pu être lancé vu qu'il n'a pas répondu à temps etc... je clik OK, mais le processus tourne toujours derrière (sans utiliser le CPU), comme si le service fonctionne correctement sauf que je ne pas mettre : "Stopper le service" mais suis obligé de killer le processus de mon programme dans le Gestionnaire des tâches. :s

    Ça fonctionne (puisque les données sont bien écrites et tout), mais à moitié ^^ Apparemment, le service attend quelque chose de mon programme, mais comme il Loop tout le temps, il reçois rien, du coup, il dit que le temps de réponse est trop long etc...

    ---

    Faut-il utiliser les Timer ? Si oui, comment, parce que j'ai essayé avec mon application, et ça fonctionne bien. Voilà comment j'ai procédé avec l'application:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Form1_Load(...)
     
            Timer1.Interval = 30000
            Timer1.Start()
     
        End Sub
     
    Private Sub Timer1_Tick(...)
     
    ' Mon programme
     
    End Sub
    Pour le service, j'ai fais comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Protected Overrides Sub OnStart(ByVal args() As String)
            ' Ajoutez ici le code pour démarrer votre service. Cette méthode doit
            ' démarrer votre service.
     
            Timer1.Interval = 30000
            Timer1.Start()
     
        End Sub
     
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
     
    'Mon programme
     
    End Sub
    Mais avec le service, il fais rien Mais en contrepartie, je n'ai pas d'erreur lorsque le service démarre

    EDIT : apparemment c'est normal ? : http://support.microsoft.com/kb/820639/fr

    Merci de m'aider ! :p

  5. #5
    Membre averti
    Inscrit en
    Août 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 56
    Par défaut
    Finalement j'ai réussi !

    J'ai ajouté un Timer "spécial" :

    - Boite d'outils, Choisir les éléments...

    Dans l'onglet Composants .NET Framework, j'ai cherché un Timer dont l'espace de noms est System.Timers, je l'ai coché puis OK.

    Dans la barre d'outils, dans la vue Général, un Timer est apparu. Je l'ai ajouté et j'ai disposé mon code de cette façon :
    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
     
    Protected Overrides Sub OnStart(ByVal args() As String)
            ' Ajoutez ici le code pour démarrer votre service. Cette méthode doit
            ' démarrer votre service.
     
            Timer1.Interval = 60000 'toutes les minutes
            Timer1.Enabled = True 'démarre la minuterie
     
        End Sub
     
    Protected Overrides Sub OnStop()
            ' Ajoutez ici le code pour effectuer les destructions nécessaires à l'arrêt de votre service.
     
            Timer1.Enabled = False
            EventLog.WriteEntry("Service arreté avec succès")
     
        End Sub
     
     Private Sub Timer1_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed
     
    'Mon programme
     
    End Sub
    Mon programme s'exécute toutes les minutes sans problèmes

  6. #6
    Membre averti
    Inscrit en
    Août 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 56
    Par défaut
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    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")
    End If
    Donc, je ne pense pas que c'est un problème d'autorisation NTFS :s

    De plus, je supprime bien le fichier avant ré-écriture avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    My.Computer.FileSystem.DeleteFile("c:\IseosViewer\" & serveur(1))
    Une idée ?

    (Pour info, les FrameWork 1.1, 2.0, 3.0 sont bien installés sur les 2 pcs)

    ----

    Voici l'erreur que j'obtiens si j'exécute le programme en "Application" sur le 2ème pc :

    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.

  7. #7
    Membre Expert Avatar de LaChips
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 109
    Par défaut
    Citation Envoyé par seb974 Voir le message
    Salut,

    Oui, mais en créant un projet : Service Windows, il faut quand même une commande pour que ça boucle toutes les X minutes, car pour l'instant je suis obligé d'appuyer sur un bouton pour que le programme effectue les commandes, or j'aimerais que ce soit fait automatiquement.

    Oui, le planificateur de tâches pourrait-être une solution, mais est-ce qu'il est actif même quand aucune session n'est ouverte ? Et je crois de plus, que ce n'est pas possible de planifier toutes les X minutes avec le planificateur de Windows, en effet, je n'ai que ces options :


    Voili voilou

    --

    T'es de Supinfo ? Moi aussi, Supinfo Océan Indien.
    Pour le planificateur de taches, quand tu clics sur le bouton avancé, tu peux choisir toutes les X minutes..

    Et ouai SUPINFO Bordeaux

  8. #8
    Membre averti
    Inscrit en
    Août 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 56
    Par défaut
    Ouais en effet mais bon, un service c'est plus classe

Discussions similaires

  1. Migration application en service
    Par Fbartolo dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/09/2007, 17h51
  2. Problème de transformation d'une application en service
    Par Zocco dans le forum Windows Serveur
    Réponses: 15
    Dernier message: 22/06/2007, 10h10
  3. Problème de lancement d'une application comme service
    Par WELCOMSMAIL dans le forum Windows Serveur
    Réponses: 5
    Dernier message: 29/03/2007, 15h46
  4. run applic comme service
    Par toctoc dans le forum EDI
    Réponses: 1
    Dernier message: 07/02/2006, 13h16
  5. démarrer une application en service
    Par Mut dans le forum Autres Logiciels
    Réponses: 15
    Dernier message: 26/09/2005, 15h08

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