[VB.net] instruction non effectuée dans une boucle

Fermé
tete2chat - 1 janv. 2014 à 16:38
InformatiWeb Messages postés 1648 Date d'inscription lundi 21 juillet 2008 Statut Membre Dernière intervention 11 décembre 2021 - 2 janv. 2014 à 18:15
Bonjour,

j'ai un soucis avec le "Label2.Text = ip" qui doit s'afficher à chaque boucle
hors le seul moyen que j'ai trouvé pour le faire c'est de rajouter cette "msgbox"
quand la msgbox est commentaire ca ne marche pas
quand la msgbox est active ca marche dans la msgbox et dans le label2 !

je comprends rien

        Dim ip As String
Dim numero As String
Dim host As String
For compteur As Integer = 1 To 30

numero = compteur
ip = "192.168.0." + numero
Label2.Text = ip
'MsgBox(ip)
If My.Computer.Network.Ping(ip) Then
host = host & vbNewLine & ip
End If
Label3.Text = host
Next

MERCI

1 réponse

InformatiWeb Messages postés 1648 Date d'inscription lundi 21 juillet 2008 Statut Membre Dernière intervention 11 décembre 2021 449
2 janv. 2014 à 18:06
c'est un problème de multi threading.

Vu que ton traitement est long, tant que ton programme est dans sa boucle, le processus d'affichage ne sait pas travailler et donc il n'arrive pas a te montrer la modification du label 2.

Lorsque tu met ta msgbox, le programme se met en pause tant que ta msgbox n'est pas fermée. Il t'ouvre donc ta msgbox avec ta valeur mais la suite ne se fera que lorsque cette petite fenêtre sera fermée.
0
InformatiWeb Messages postés 1648 Date d'inscription lundi 21 juillet 2008 Statut Membre Dernière intervention 11 décembre 2021 449
Modifié par pijaku le 3/01/2014 à 10:11
Voilà le code en utilisant le multi-threading.
Attention, ça peut être difficile à comprendre au début :

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        ' Lance un sous-processus
        Dim t As New System.Threading.Thread(AddressOf sous_processus)
        t.Start()
    End Sub

    ' Cette méthode (ou fonction) est effectuée par le sous-processus
    ' Tu dois donc faire un Invoke du label a modifier car dans le cas contraire
    ' tu auras une erreur :
    ' Opération inter-threads non valide : le contrôle a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il à été crée
    Private Sub sous_processus()
        Dim ip As String
        Dim numero As String
        Dim host As String = ""
        For compteur As Integer = 1 To 30

            numero = compteur
            ip = "192.168.1." + numero
            MAJ_inter_thread(Label2, ip)
            'MsgBox(ip)
            If My.Computer.Network.Ping(ip) Then
                host = host & vbNewLine & ip
            End If
            MAJ_inter_thread(Label3, host)
        Next
    End Sub

    ' Ceci permet de faire une modification "thread safe" sur des labels, ...
    Private Delegate Sub _MAJ_inter_thread(label As Label, ByVal valeur As String)
    Private Sub MAJ_inter_thread(label As Label, ByVal valeur As String)
        If Label2.InvokeRequired Then
            Dim d As New _MAJ_inter_thread(AddressOf MAJ_inter_thread)
            Me.Invoke(d, New Object() {label, valeur})
            Exit Sub
        End If

        ' Modifie le texte du label passé en paramètre
        label.Text = valeur

    End Sub
0