Boucle for qui depasse

Résolu
gperuch Messages postés 40 Date d'inscription dimanche 18 janvier 2009 Statut Membre Dernière intervention 2 février 2012 - 20 mars 2008 à 17:00
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 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

6 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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.

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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...)
0
gperuch Messages postés 40 Date d'inscription dimanche 18 janvier 2009 Statut Membre Dernière intervention 2 février 2012 1
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" ????

greg
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
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.

A+
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
0
Rejoignez-nous