Boucle for qui depasse [Résolu]

Signaler
Messages postés
40
Date d'inscription
dimanche 18 janvier 2009
Statut
Membre
Dernière intervention
2 février 2012
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
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

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
"...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
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
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...)
Messages postés
40
Date d'inscription
dimanche 18 janvier 2009
Statut
Membre
Dernière intervention
2 février 2012
1
-->(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
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
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 ?
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
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+
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
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)