Boucle for qui depasse [Résolu]

gperuch 40 Messages postés dimanche 18 janvier 2009Date d'inscription 2 février 2012 Dernière intervention - 20 mars 2008 à 17:00 - Dernière réponse : cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention
- 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
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 20 mars 2008 à 23:15
3
Merci
"...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

Merci cs_casy 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de cs_casy
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 20 mars 2008 à 17:12
0
Merci
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...)
Commenter la réponse de jmfmarques
gperuch 40 Messages postés dimanche 18 janvier 2009Date d'inscription 2 février 2012 Dernière intervention - 20 mars 2008 à 19:16
0
Merci
-->(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
Commenter la réponse de gperuch
Kristof_Koder 920 Messages postés vendredi 3 août 2007Date d'inscription 27 octobre 2008 Dernière intervention - 20 mars 2008 à 23:00
0
Merci
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 ?
Commenter la réponse de Kristof_Koder
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 20 mars 2008 à 23:02
0
Merci
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+
Commenter la réponse de bigfish_le vrai
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 21 mars 2008 à 01:40
0
Merci
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)
Commenter la réponse de cs_Jack

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.