gperuch
Messages postés40Date d'inscriptiondimanche 18 janvier 2009StatutMembreDernière intervention 2 février 2012
-
20 mars 2008 à 17:00
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
21 mars 2008 à 01:40
ci joint in petit programme qui me permet un premiere approche de threads, le probleme c'est que bien que ma variable A ou B n'est incrementé que par un FOR elle arrive à depassé la valeur max de celui ci, dans la source que je met A atteint 10001 ou bien 10006 six j'ai cliqué 6 fois sur le boutton 10007 7 fois etc...
Comment est ce possible???
(mettre un form1 ,label1,label2,timer1 et button1 et coller le code)
Imports System.Threading
Public Class Form1
Public A As Integer
Public B As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' test de thread
Dim Thread_Son As New Thread(AddressOf boucle1)
Dim Thread_Son2 As New Thread(AddressOf boucle2)
Timer1.Interval = 10
Timer1.Enabled = True
Thread_Son.Start()
Thread_Son2.Start()
End Sub
Sub boucle1()
For A = 1 To 10000
Application.DoEvents()
Next
End Sub
Sub boucle2()
For B = 1 To 10000
Application.DoEvents()
Next
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Label1.Text = A
Label2.Text = B
End Sub
End Class
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 20 mars 2008 à 23:15
"...affiches le dans la boucle ? non ?..."
boucle1 fonctionnant dans un thread séparé, il n'est pas possible (de manière simple) d'accèder aux controles de la form qui eux sont dans le thread principal.
Quoiqu'il en soit, le fait que les variables soient publiques est peut-etre à l'origine du problème.
L'explication est que systématiquement à la fin du traitement dans la boucle A est incrémenté de 1. Quand la boucle est terminée, A doit etre égal à 10001. C'est le fait que lorsque le traitement revient en début de boucle, A est suppérieur à 10000 qui fait sortir de la boucle.
Donc supposons que l'on clique 7 fois sur le bouton, c'est à dire 1 première fois pour lancer le premier thread puis 6 autres fois avant que le premier thread soit terminé. les 7 threads tournent en paralllèle sur une seule variable. Chacune des boucles va augmenter A de 1. Donc à chaque cycle A sera augmenté de 7 (et non pas 1).
Mais lors du cycle final, normalement pour A = 10000, chacune des boucles va augmenter de 1, ce qui peut exliquer le +7 à la fin.
Je ne peux malheureusement pas faire de tests pour confirmer tout cela car je pense que mon explication n'est tout de même pas complète.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 20 mars 2008 à 17:12
Ben...
Utilise donc un compteur incrémenté à chaque Click
et fais ta boucle sur 1000 + compteur !
(bien que je ne comprenne absolument pas à quoi servent tes deux bloucles ...sur A et B...)
gperuch
Messages postés40Date d'inscriptiondimanche 18 janvier 2009StatutMembreDernière intervention 2 février 20121 20 mars 2008 à 19:16
-->(bien que je ne comprenne absolument pas à quoi servent tes deux bloucles ...sur A et B...)
pour tester le multithreading j'ai fait un simple programme qui consiste à faire tourner deux compteur ensemble.
Je ne veux pas une solution à mon pb (des boucles il y a plusieurs facon d'en faire!!!) mais une explication sur le pourquoi de mon integer A qui arrive à depasser 10000 (proportionnelement aux nombre de clic) alors qu'il est definis avec "for a = 1 to 10000" ????
Kristof_Koder
Messages postés918Date d'inscriptionvendredi 3 août 2007StatutMembreDernière intervention27 octobre 200810 20 mars 2008 à 23:00
A et B ne sont pas locaux à tes sub boucle1 et Boucle2. Donc mon avis le souci vient de la ...
tu auras beau faire autant de threads que tu veux pour lancer Boucle1 par exemple, les boucles for que tu lances sur A travaille sur la même adresse mémoire !!
Je suis même surpris que cela ne merde pas plus que ca !
Tu vas me dire que "pour pouvoir afficher A dans la label dans l'EVt de mon timer, il faut bien qu'il soit public à la classe !"
Mais pourquoi utiliser un timer pour l'afficher ? affiches le dans la boucle ? non ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201315 20 mars 2008 à 23:02
Salut,
a mon avis ce ne sont pas tes variables A et B qui prennent une valeur en fonction du nombre de clique de souris mais plutot tes labels. Essaye de mettre un point d'arret ou utilise une message box pour afficher les valeurs respectives de A et B. Ne me demande pas pourquoi car je ne suis pas assé calé pour te repondre.
A = 0
B = 0
avant de lancer tes boucles devrait resoudre le pb, mais je reconnais que ce serait mieux de comprendre, si il y a quelque chose a comprencdre evidemment.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 21 mars 2008 à 01:40
Salut
A la sortie d'une boucle For-Next, la variable utilisée est toujours supérieure de 1 fois l'incrément.
Il fait X fois la boucle, incrémente la variable sur le Next puis s'aperçoit que la boucle est terminée.
C'est comme ça.
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)