Utilisation de Control entre deux class [Résolu]

Messages postés
27
Date d'inscription
mercredi 20 janvier 2010
Statut
Membre
Dernière intervention
5 septembre 2018
- - Dernière réponse : Whismeril
Messages postés
13294
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 mai 2019
- 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
Afficher la suite 

Votre réponse

3 réponses

Messages postés
13294
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 mai 2019
273
0
Merci
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.
Commenter la réponse de Whismeril
Messages postés
27
Date d'inscription
mercredi 20 janvier 2010
Statut
Membre
Dernière intervention
5 septembre 2018
0
Merci
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.
Commenter la réponse de scoob79
Messages postés
13294
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 mai 2019
273
0
Merci
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...
Commenter la réponse de Whismeril