[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
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
A voir également:
- [VB.net] instruction non effectuée dans une boucle
- Le fichier contient un programme écrit en python. le programme construit un mot secret mais il ne l'affiche pas. modifiez ce programme afin que à chaque itération de la boucle : la variable a augmente de 2 la variable b diminue de 1 ajoutez une instruction pour faire afficher le mot secret construit. quel est ce mot secret ? ✓ - Forum Python
- Pc s'allume et s'éteint en boucle - Forum Matériel informatique
- Boucle cmd - Forum Programmation
- Freebox redémarre en boucle ✓ - Forum Freebox
- L'instruction a 0x0000 ne peut pas être read - Astuces et Solutions
1 réponse
InformatiWeb
Messages postés
1648
Date d'inscription
lundi 21 juillet 2008
Statut
Membre
Dernière intervention
11 décembre 2021
451
2 janv. 2014 à 18:06
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.
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.
Modifié par pijaku le 3/01/2014 à 10:11
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