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 :

demande d'un petit eclairsissement,sur un petit bout de code .


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 141
    Points : 59
    Points
    59
    Par défaut demande d'un petit eclairsissement,sur un petit bout de code .
    salut,
    quelqu'un pourrait mieux m'expliquer ce micro bou de code ?
    et ce "do while True",il genere pas une boucle infinie ca ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
     Try
     
     
                Do While True
                    TryPing()
                    ' Sleep 900ms to be sure at least one Tick happens on each second
                    Thread.Sleep(900)
                Loop
     
            Catch ex As Exception
          end try

  2. #2
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    C'est effectivement une boucle infinie qui exécute la méthode TryPing() toutes les 900ms.
    D'après son nom, j'imagine que TryPing() exécute un ping vers une adresse donnée pour savoir si elle répond. Dans le cas où elle ne répondrait pas, il y a surement une levée d'exception qui permet de sortir de la boucle.

  3. #3
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Effectivement, la seule porte de sortie est levée d'exception non gérée dans la méthode TryPing().

    Sauf que, conceptuellement, une méthode qui s'apelle TryQuelquechose() devrait renvoyée un booléen si ce qu'elle doit faire n'a pas réussit, plutôt que lever une exception. C'est mon point de vue évidement, mais si l'on observe le framework, c'est le même point de vue.

  4. #4
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut
    Personnellement, quand je vois ce code, ca me laisse perplexe, meme si on ne doit pas avoir tout le code en relation.

    - Utiliser un boucle infinie de ce type ... mieux vaut utiliser un simple timer qui gerera mieux cela et dans ce cas.
    - Cependant et en extrapolant un peu, je pense que cette boucle a ete mise en place pour une sortie quand la classe TryPing() renvoi un false ...

  5. #5
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Citation Envoyé par Danyel Voir le message
    - Cependant et en extrapolant un peu, je pense que cette boucle a ete mise en place pour une sortie quand la classe TryPing() renvoi un false ...
    Pas vraiment, vu qu'on ne récupère pas ce qu'elle pourrait renvoyer...

  6. #6
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut
    Oui je sais, mais c'est ce qui m'est venu à l'esprit en premier en voyant le code.
    (puis j'ai bien dit : En Extrapolant )

  7. #7
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Ou alors c'est un thread dédié à cette tâche ingrate, qui fait quelque chose avec ce ping (genre l'afficher ou le logger), et se fait lâchement tuer à la sortie de l'appli par le père ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 141
    Points : 59
    Points
    59
    Par défaut
    enfait voilà le code du tryping()
    j'en deduis qu'il ya effictivement une boucle infinie non ? quelqu'un pourrait me suggerer une petite solution pour ca ? merci .

    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
     
     
     Private Sub TryPing()
     
            ' CurrentSecond is the number of seconds passed after midnight
            Dim CurrentSecond As Long = CLng(Now().Subtract(Today()).TotalSeconds())
     
            ' Eventually reload configuration
            Try
     
     
                If CurrentSecond Mod ReloadConfigFrequency = 0 Then
                    RefreshSettings()
                End If
     
                ' Analyze the list of hosts to be pinged 
                Dim dr As DataRow
                For Each dr In dtHosts.Rows
                    ' Check if time is come to ping the specific host
                    If CurrentSecond Mod CInt(dr("PingFreq")) = 0 Then
                        ' Ping the specific host
                        Dim IsAlive As Boolean = HostIsAlive(dr("Host"))
                        Dim LastStatus As String = HostLastStatus(dr("Host"))
                        If LastStatus = "" OrElse _
                          (LastStatus = "ON" And Not IsAlive) OrElse _
                          (LastStatus = "OFF" And IsAlive) Then
                            StoreStatusTransition(dr("Host"), IsAlive)
                        End If
                    End If
     
                Next
            Catch ex As Exception
     
                MsgBox(ex.Message)
            End Try
     
        End Sub
    mais enfait le ping en question se fait grace à HostIsalive


    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
     
     
    Private Function HostIsAlive(ByVal Host As String) As Boolean
     
     
            Dim pingSender As New Net.NetworkInformation.Ping
            Dim reply As Net.NetworkInformation.PingReply
            Try
                reply = pingSender.Send(Host)
                If reply.Status = IPStatus.Success Then
                    Return True
                Else
                    Return False
                End If
            Catch ex As Exception
                Return False
            End Try
        End Function

  9. #9
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Mais que cherches-tu exactement ?
    Ton truc ping une liste de machines, puis stocke les transitions de statut quelque part (une log, un affichage, ...).

    Si tu veux savoir quand ça s'arrête, je pense que c'est le processus qui a lancé le thread qui doit faire un Thread.Kill à la fin (je sais pas si ça s'écrit comme ça, mais ça doit être un truc de ce genre...).

    Donc quel est ton problème ?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 141
    Points : 59
    Points
    59
    Par défaut
    ben mon problem est qu'il ne stoque pas dans ma table pinglog le resultat du ping.
    commme il n'y'a pas d'erreur de compilation, et le service tourne et tout..
    deplus que le code m'a l'air bon,j'essaye de decortiquer petit à petit..,pour chercher l'erreur.
    donc,j'ai pensé à cette boucle là..
    au debut c'etait logique pour moi (le while true..) ,mais maintenant je doute en tous en fait..
    je commence à douter meme dans ma base de donnée^^

    mais bon..
    merci quand meme

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 141
    Points : 59
    Points
    59
    Par défaut
    et si ça interesse quelqu'un de voir tout le code..
    bon,ben le voilà..
    merci d'avance .

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
     
    Imports System.Configuration
    Imports System.Data.SqlClient
    Imports System.Net.NetworkInformation
    Imports System.Threading
    Imports System.IO
    Imports System.Net.NetworkInformation.Ping
     
    Public Class PingMonitorService
     
      Dim ThreadTask As Thread
      Dim ConnStr As String
      Dim ReloadConfigFrequency As Integer
      Dim dtHosts As New DataTable      ' Hosts to be checked
     
      Protected Overrides Sub OnStart(ByVal args() As String)
        RefreshSettings()
        ThreadTask = New Thread(AddressOf MainTask)
        ThreadTask.Start()
      End Sub
     
        Protected Overrides Sub OnStop()   
            ThreadTask.Abort()
        End Sub
     
      Private Sub RefreshSettings()
        ConnStr = ConfigurationManager.AppSettings("ConnStr").ToString()
        ReloadConfigFrequency = CInt(ConfigurationManager.AppSettings("ReloadConfigFrequency"))
     
            Dim daHosts As New SqlDataAdapter("SELECT host, PingFreq FROM HostList ", ConnStr)
        dtHosts.Clear()
        daHosts.Fill(dtHosts)
      End Sub
     
      Private Sub MainTask()
            Try
     
     
                Do While True
                    TryPing()
                    ' Sleep 900ms to be sure at least one Tick happens on each second
                    Thread.Sleep(900)
                Loop
     
            Catch ex As Exception
     
                MsgBox(ex.Message)
            End Try
        End Sub
     
      Private Sub TryPing()
     
        ' CurrentSecond is the number of seconds passed after midnight
            Dim CurrentSecond As Long = CLng(Now().Subtract(Today()).TotalSeconds())
     
        ' Eventually reload configuration
            Try
     
     
                If CurrentSecond Mod ReloadConfigFrequency = 0 Then
                    RefreshSettings()
                End If
     
                ' Analyze the list of hosts to be pinged 
                Dim dr As DataRow
                For Each dr In dtHosts.Rows
                    ' Check if time is come to ping the specific host
                    If CurrentSecond Mod CInt(dr("PingFreq")) = 0 Then
                        ' Ping the specific host
                        Dim IsAlive As Boolean = HostIsAlive(dr("Host"))
                        Dim LastStatus As String = HostLastStatus(dr("Host"))
                        If LastStatus = "" OrElse _
                          (LastStatus = "ON" And Not IsAlive) OrElse _
                          (LastStatus = "OFF" And IsAlive) Then
                            StoreStatusTransition(dr("Host"), IsAlive)
                        End If
                    End If
     
                Next
            Catch ex As Exception
     
                MsgBox(ex.Message)
            End Try
     
      End Sub
     
      Private Function HostIsAlive(ByVal Host As String) As Boolean
     
     
            Dim pingSender As New Net.NetworkInformation.Ping
            Dim reply As Net.NetworkInformation.PingReply
            Try
                reply = pingSender.Send(Host)
                If reply.Status = IPStatus.Success Then
                    Return True
                Else
                    Return False
                End If
            Catch ex As Exception
                Return False
            End Try
        End Function
     
      Private Function HostLastStatus(ByVal Host As String) As String
        Dim cnn As New SqlConnection(ConnStr)
        Dim cmd As SqlCommand = cnn.CreateCommand
        cmd.CommandText = "SELECT TOP 1 Status FROM PingLog WHERE Host='" & Host & "' ORDER BY RecordingDate DESC"
        cnn.Open()
        Dim obj As Object = cmd.ExecuteScalar
        cnn.Close()
        Try
          Return obj.ToString().ToUpper()
        Catch
          Return ""
        End Try
      End Function
     
      Private Sub StoreStatusTransition(ByVal Host As String, ByVal IsAlive As Boolean)
        Dim cnn As New SqlConnection(ConnStr)
        Dim cmd As SqlCommand = cnn.CreateCommand
        If IsAlive Then
          cmd.CommandText = "INSERT PingLog (Host, Status, RecordingDate) VALUES ('" & Host & "', 'ON', GETDATE())"
        Else
          cmd.CommandText = "INSERT PingLog (Host, Status, RecordingDate) VALUES ('" & Host & "', 'OFF', GETDATE())"
        End If
        Try
          cnn.Open()
          cmd.ExecuteNonQuery()
        Catch
        Finally
          Try
            cnn.Close()
          Catch
          End Try
        End Try
      End Sub
     
    End Class

  12. #12
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Tu peux l'exécuter en debug ?
    Est-ce que ta base est initialisée avec les bon statuts de ping ?
    (parce que s'ils sont en ON et que le ping passe à chaque fois...)
    Est-ce que tes Fréquences de ping sont bonnes ?
    Parce que CurrentSecond Mod CInt(dr("PingFreq")) = 0, ça peut ne pas arriver souvent...
    En fait, je sais pas si statistiquement, ça arrive.
    Certes ton Thread se réexécute à intervalle régulier... mais s'il y a du décalage à l'exécution, qui sait quand ça tombera juste ?
    [EDIT]
    Tiens d'ailleurs, je te conseillerais d'essayer sans

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 141
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Tu peux l'exécuter en debug ?
    enfait non,je peux pas l'executer en debug puisque c'est un service windows.j'ai deja essayé en definissant à chaque fois un break point,mais non ca marche pas..

    Est-ce que ta base est initialisée avec les bon statuts de ping ?
    (parce que s'ils sont en ON et que le ping passe à chaque fois...)
    j'ai pas trop bien saisi là..ils sont pas en "ON" des le debut,mais selon le ping le statut va etre ON ou OFF .

    Est-ce que tes Fréquences de ping sont bonnes ?
    Parce que CurrentSecond Mod CInt(dr("PingFreq")) = 0, ça peut ne pas arriver souvent...
    En fait, je sais pas si statistiquement, ça arrive.
    Certes ton Thread se réexécute à intervalle régulier... mais s'il y a du décalage à l'exécution, qui sait quand ça tombera juste ?
    j'ai pensé à ca, mais enfait ce ci sert aussi à faire en sorte de random dans sur la colonne de la base,puisque de toutes les facons,avec le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim CurrentSecond As Long = CLng(Now().Subtract(Today()).TotalSeconds())
    le currentsecond change au fur et à mesure donc necesserement à un moment donné tu vas trouvé un mod(PingFreq) = 0
    et ce host là qui va etre pinger..
    Tiens d'ailleurs, je te conseillerais d'essayer sans
    sans quoi ? sans thread ?
    on m'avait conseillé de faire un thread dés le debut enfait..

    mais question: à ton avi est ce possible de faire un timer au lieu de currentsecond et tout ?
    je m'etais lancée dans ce sens il y'a un temps..mais j'avoue que je me suis perdue (moi et les timer ca fait deux )

    deplus,on m'a dit qu'un timer bouffe beaucoup de ressource..

    merci bien en tous cas pacman

  14. #14
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Ah désolé, je croyais que ça s'exécutait toutes les 900 secondes...
    Concernant le thread, ce n'est pas forcément un problème.
    Ce que je voulais dire, c'est enlever les tests d'exécution.

    J'ai pas bien vu : c'est où que c'est défini comme un service ?
    Parce que pour faire des pings et écrire dans une table, tu dois pouvoir le lancer à la main comme ça en débug, non ?

    Sinon, si jamais ce n'est vraiment pas possible de le debuger, tu peux tenter de virer tous les Try, comme ça au moins ça va se vautrer !
    (ou alors tenter l'écriture dans une log fichier)

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 141
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par pacmann Voir le message

    J'ai pas bien vu : c'est où que c'est défini comme un service ?
    Parce que pour faire des pings et écrire dans une table, tu dois pouvoir le lancer à la main comme ça en débug, non ?
    euh,c'est moi qui suis desolée
    tu as raison ca se voit dans ce code qu'il est un service
    (à part le nom de la classe pingmonitorservice )

    merci en tous cas

  16. #16
    _51
    _51 est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    Pour debugger une service y a un petit truc tres sympatoche :

    tu met Debugger.Launch() dans le OnStart, à l'execution ca va ouvrir une fenetre qui permet de choisir un debugger (ton visual studio), et hop les breakpoint marchent ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 27/07/2011, 13h08
  2. demande un petit aide sur TOAD
    Par wagui26 dans le forum Débuter
    Réponses: 2
    Dernier message: 14/04/2008, 18h33
  3. Petite aide sur la comprehension d'un code
    Par Pauli dans le forum Langage
    Réponses: 2
    Dernier message: 20/05/2007, 20h24
  4. [Visuel XP] Petite question sur le theme XP...
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 12
    Dernier message: 20/01/2005, 14h41
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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