Utilisation de Control entre deux class [Résolu]

scoob79 27 Messages postés mercredi 20 janvier 2010Date d'inscription 5 septembre 2018 Dernière intervention - 17 août 2018 à 17:29 - Dernière réponse : Whismeril 12216 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 novembre 2018 Dernière intervention
- 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

Whismeril 12216 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 novembre 2018 Dernière intervention - 18 août 2018 à 07:42
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
scoob79 27 Messages postés mercredi 20 janvier 2010Date d'inscription 5 septembre 2018 Dernière intervention - Modifié par scoob79 le 20/08/2018 à 09:53
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
Whismeril 12216 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 novembre 2018 Dernière intervention - 20 août 2018 à 10:34
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.