Utilisation de Control entre deux class

Résolu
scoob79 Messages postés 27 Date d'inscription mercredi 20 janvier 2010 Statut Membre Dernière intervention 5 septembre 2018 - 17 août 2018 à 17:29
Whismeril Messages postés 18417 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2023 - 20 août 2018 à 10:34
Bonjour,

je suis bloquée sur mon code en faite j'ai un timer qui me lance en un code dans un class en multithread.
le réslutat de mon dans la class multithread dans être afficher dans un DGV. Or le code s'execute sans problème pas d'erreur mais rien n'est affiché.

Code timer :

    Public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim Tasks As New TasksClass()
        Dim ThreadPing As New System.Threading.Thread( _
        AddressOf Tasks.Ping_serveur)
        Tasks.StrArg = "Ping Serveur" ' Définir un champ utilisé comme argument
        ThreadPing.Start() ' Démarrer le nouveau thread.
        Timer1.Interval = 600000
    End Sub


code de la class:

Public Class TasksClass
    Public P As Principale
    Friend StrArg As String
    Friend RetVal As Boolean
    Public Sub Ping_serveur()
        Dim Serveur As New StreamReader("c:\temp\serveur.ini"), Ligne As String, Ping_serveur, N
        N = 0
        Dim P As New Principale
        Do
            Ligne = Serveur.ReadLine()
            Try
                Ping_serveur = My.Computer.Network.Ping(Ligne)
            Catch pex As System.Net.NetworkInformation.PingException
                N += 1
                P.DataGridView6.Rows.Add(N, "Le serveur " & Ligne & " n'est pas en ligne.", "Critique")
            End Try
            Ligne = ""
        Loop Until Ligne Is Nothing
    End Sub
End Class


Eset-ce quelqu'un aurait une idée ?

merci

3 réponses

Whismeril Messages postés 18417 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2023 624
18 août 2018 à 07:42
Bonjour,
Je voies 2 problèmes.

Celui qui t’embête et celui qui t’embêtera quand le premier sera réglé.
Public P As Principale

Ce code initie une nouvelle instance de principale, donc pas celle qui est affichée.
Il faudrait donc passer en paramètre la référence de Principale qui est affichée, mais si tu fais ça tu vas te trouver face au 2eme problème qui est qu’un contrôle ne peut être modifié que par le thread de son form.
Donc là il faut se demander si un ping par minute nécessite toute cette usine à gaz.

A mon sens, dans le timer, sans thread, ça devrait marcher sans problèmes.
0
scoob79 Messages postés 27 Date d'inscription mercredi 20 janvier 2010 Statut Membre Dernière intervention 5 septembre 2018
Modifié le 20 août 2018 à 09:53
Salut,

en faite le ping doit être effectué par un Thread car le programme doit rester disponible (environ 240 serveurs à pinguer), avec un simple timer le programme reste bloqué.
Effectivement
Public P As Principale
ne convient pas dans cette configuration.

J'ai, a ma grande surprise, trouvé la solution sur Youtube (lol) en faite pour modifier un contrôle d'une Form depuis un Thread il faut passer par Invoke.

Exemple :

Sur ma Form1 j'ai un label1 que je souhaite modifier.

Public Sub Lancement()
        Dim ThreadPing As New System.Threading.Thread(AddressOf Méthode)
        ThreadPing.Start() ' Démarrer le nouveau thread.
End Sub

Public Sub Méthode ()
         Invoke(New MethodInvoker(Sub() Label1.Text = "Texte"))
End Sub


Lien Vidéo
|------ > https://www.youtube.com/watch?v=cIU8Xr8Ri7Y (Partie 1)
|------ > https://www.youtube.com/watch?v=UNTB1eDi1O8 (Partie 2)

Merci pour ton aide.
0
Whismeril Messages postés 18417 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2023 624
20 août 2018 à 10:34
en faite le ping doit être effectué par un Thread car le programme doit rester disponible (environ 240 serveurs à pinguer)

Un timer marche un peu comme un thread, c’est pas aussi indépendant mais pour un ping toutes les minutes cela aurait suffit largement. Pour 240 faut voir.

Par contre, tu m’aurais dit cela juste après ma réponse, je t’aurais de suite orienté vers un Invoke ou un Dispatcher...
0