scoob79
Messages postés27Date d'inscriptionmercredi 20 janvier 2010StatutMembreDernière intervention 5 septembre 2018
-
17 août 2018 à 17:29
Whismeril
Messages postés18417Date d'inscriptionmardi 11 mars 2003StatutContributeurDerniè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
Whismeril
Messages postés18417Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 5 juin 2023624 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.
scoob79
Messages postés27Date d'inscriptionmercredi 20 janvier 2010StatutMembreDerniè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
Whismeril
Messages postés18417Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 5 juin 2023624 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...