Exécution de deux boucle while en même temps

vool - 21 mai 2013 à 17:56
 vool - 24 mai 2013 à 11:04
Bonjour, je suis étudiant en GEII et je suis actuellement en stage.
J'ai un problème dans mon programme.

A un certain moment dans mon programme, je voudrais exécuter deux boucle while en même temps.

While donnee = ""                                                                                       
                                Affiche_reception()
                            End While

                            While donnee = ""                                                                                       
                                If ProgressBar1.Value <> ProgressBar1.Maximum Then
                                    Timer1.Interval = 1000
                                    Timer1.Start()
                                End If
                                Application.DoEvents()
                            End While


Pouvez vous m'aider s'il vous plait

Merci

36 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 mai 2013 à 18:15
Bonjour,
Je ne te comprends pas.
Dès lors que ces deux boucles répondent à la même condition (donnée = ""), pourquoi en lancer deux et ne mas mettre toutes tes instructions dans une seule ?
Je ne comprends pas non plus la nécessité de redémarrer sans cesse ton timer.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
21 mai 2013 à 18:49
Bonjour,

Peut être parles-tu de Thread ?

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
0
Utilisateur anonyme
21 mai 2013 à 23:49
Application.DoEvents()
0
Utilisateur anonyme
22 mai 2013 à 02:59
Bonjour,

Personne ne t'a encore enseigné que la boucle While - Wend est une antiquité qui date presque de Mathusalem et que cela traîne-là pour des questions compatibilité ?

Ouvre ton aide au plus sacrant et constate que la boucle Do - Loop et ses nombreuses variantes est mauditement plus intelligente.
0

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

Posez votre question
Bonjour,

Ma première boucle permet de récupérer un caractère à un certain moment sur un port RS232 c'est pour cela que je ne rassemble pas mes deux boucles car sur de nombreux tests ma fonction affiche_reception() s'activait alors que le caractère était deja envoyer, je loupe l'envoi du caractere.

Donc je dois avoir une boucle avec affiche_reception qui tourne rapidement et tout le temps jusqu'à recevoir le caractère,

Et une deuxieme boucle qui me permet d'incrémenter mon progressbar toute les secondes
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
22 mai 2013 à 09:58
Salut

Un truc me fait tilt à chaque fois qu'on parle de liaison série sous VB.Net :
A chaque fois, vous faites des boucles de lecture du buffer en attente de données.
En VB6, l'objet de connexion déclenchait un évènement lorsque le buffer contenait X data, où X était paramétrable; éventuellement 1 s'il on voulait qu'il se déclenche à chaque activité.

N'y a t-il vraiment pas ce même comportement sous .Net ?
Je n'ai pas vérifié, c'est une vraie question.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
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
22 mai 2013 à 10:02
Voir le paramètre ReceivedBytesThreshold et l'évènement _DataReceived
0
Utilisateur anonyme
22 mai 2013 à 13:00
Bonjour jack,

A chaque fois, vous faites des boucles de lecture du buffer en attente de données.

vb6 devait faire la même chose de façon transparente pour l'utilisateur.
Je pense que l'événement DataReceived (ou quelque chose comme ça) était conçu pour plus de facilité d'écriture du code. Et en y regardant bien, ce principe est très limité finalement.
On peut très bien implémenter ce type d'événement en .NET avec la possibilité de l'enrichir de données supplémentaires par le biais d'un argument d'événement (e en principe) présenté sous forme de classe personnalisée par exemple. En gros, avant le déclenchement de l'événement, on peut donc préparer des données à envoyer.
On peut aussi déclencher divers événements selon les données lues dans le buffer. Ceci évite de devoir tout traiter dans la même sub (Datareceived).
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 mai 2013 à 13:10
Bonjour à tous,
Ce que moi, je ne comprends pas (et ne comprendrai jamais), c'est ce que viendrait faire l'utilisation d'un timer pour faire progresser une barre de progression.
Ce n'est pas la première fois que je "vois" cette "philosophie" qui, pour moi, ne correspond à rien d'exact, voire de logique.
Pour moi, une barre de progression CONSTATE une progression. Elle n'en donne pas l'illusion.
Et que vois-je, en outre, qui me fait littéralement bondir : on fait par le code montré "progresser" une barre jusqu'à ce que sa valeur maxi soit atteinte, comme si sa valeur maxi correspondait à la fin d'une "réception" !
Rien de cela ne me parait personnellement "orthodoxe" ! Autant remplacer la barre de progression par n'importe quelle "animation", dans ce cas !
En résumé : je n'aime pas, pas du tout, même, ce "genre-là".

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Utilisateur anonyme
22 mai 2013 à 13:14
J'ai déjà signalé sa mauvaise conception du code au demandeur dans une autre discussion. Mais c'est resté sans réponse...
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
22 mai 2013 à 15:40
@Banana32 :
paramètre ReceivedBytesThreshold et l'évènement _DataReceived : Je parlais bien de .Net
0
Peut être que j'utilise mal le progressbar mais je voulais l'incrémenter de 1 toutes les secondes
 
While donnee = ""                                                                                       
     If ProgressBar1.Value <> ProgressBar1.Maximum Then
         Timer1.Interval = 1000
         Timer1.Start()
     End If
     Application.DoEvents()
End While


Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Timer1.Stop()
        ProgressBar1.Value += 1
End Sub
0
Utilisateur anonyme
22 mai 2013 à 16:27
Bonjour,

C'est fou notre manque de pouvoir de persuasion... ton code ne fera rien de rien, même au niveau graphique (visuel), si c'est ça le but.

Tout ce que tu vas obtenir c'est un blocage dans ta boucle, (sans voir un peu plus le restant du code)

Mais si tu veux rester dans ta "toile d'araignée", sans tenir compte des avis des autres...

        Timer1.Interval = 1000
        Timer1.Enabled = True
        Do While donnée = ""
            Application.DoEvents()
        Loop
        ProgressBar1.Value = ProgressBar1.Maximum
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If ProgressBar1.Value < ProgressBar1.Maximum Then
            ProgressBar1.Value += 1
        Else
            Timer1.Enabled = False
        End If
    End Sub



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
22 mai 2013 à 17:29
Merci jack

ReceivedBytesThreshold :
Obtient ou définit le nombre d'octets dans la mémoire tampon d'entrée interne avant qu'un événement DataReceived ne se produise.

Il faut me montrer un exemple de code sans boucle donc

DataReceived :
Les événements reçus en série peuvent être provoqués par l'un des éléments de l'énumération SerialData. Étant donné que le système d'exploitation détermine s'il convient ou non de déclencher cet événement, toutes les erreurs de parité peuvent ne pas être signalées.

Les événements PinChanged, DataReceived et ErrorReceived peuvent être appelés de façon désordonnée et il peut y avoir un léger délai entre le moment où le flux sous-jacent signale l'erreur et le moment où le gestionnaire d'événements est exécuté. Un seul gestionnaire d'événements peut s'exécuter à la fois.

L'événement DataReceived n'est pas forcément déclenché pour chaque octet reçu. Utilisez la propriété BytesToRead pour déterminer combien de données restent à lire dans la mémoire tampon.

L'événement DataReceived est déclenché sur un thread secondaire lorsque des données sont reçues de l'objet SerialPort. Cet événement étant déclenché sur un thread secondaire et non sur le thread principal, toute tentative de modification d'éléments inclus dans le thread principal, tels que les éléments de l'interface utilisateur, peut lever une exception de thread. S'il est nécessaire de modifier des éléments dans le Form ou Control principal, renvoyez les demandes de modification à l'aide de Invoke, qui réalisera la tâche sur le thread approprié.


Conclusion : Il est préférable de boucler mais ceci n'engage que moi bien entendu.
0
Bonjour Acive

Pourquoi parle tu de toile d'araignée, mon programme il marche.

Juste je voudrais rajouter un progressbar qui s'incrémente pendant que un test est effectué sur mon automate.

Mon automate envoi un caractère par la liaison rs232 quand le test est terminé, c'est pour cela que dans mon programme je dis de lire sur le port rs232 tant que le caractère n'est pas envoyer.

Pour rajouter mon progressbar, je fais une même boucle, incrémenter mon progressbar toutes les secondes tant que le caractère n'est pas envoyer.

Le problème c'est que ces deux boucles doivent fonctionner en même temps et elles ne peuvent pas être rassemblé car sinon la lecture sur le port rs232 se fais toutes les secondes à cause de mon timer et mon programme loupe la réception du caractère.

J'espère avoir été clair sur mon problème,

Merci
0
Utilisateur anonyme
22 mai 2013 à 18:36
Alors... confus tout ça...

Mais si j'ai bien compris:
1) Tu lui envois une commande pour faire un test (à l'automate)
2) Rien ne se passe par le port RS pendant ce temps
3) Tu sais juste que le test dure x secondes
3) A la fin du test l'automate t'envoi un caractère pour dire que c'est fini

C'est bien ça ???



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
22 mai 2013 à 18:41
Tu dois lancer ton timer avant d'enter dans la boucle. Sinon, il sera lancé en permanence et n'atteindra jamais son temps d'écoulement. Ensuite, il ne faudra le stopper que lorsqu'il aura atteint sa valeur maximale.
0
Oui c est sa Acive
0
Utilisateur anonyme
22 mai 2013 à 19:14
Hé bien, dans ce cas il nous reste effectivement l'option du timer uniquement.

Ce ne serait pas le cas si (par exemple) il nous renvoyais des caractère à la fin de chaque étape de son test.

Alors le principe:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim NbreDeSecQuiDureLeTest As Integer = 10 'Le test dure 10 sec
        SerialPort1.Write("?") 'démarrage du test
        ProgressBar1.Maximum = NbreDeSecQuiDureLeTest
        ProgressBar1.Value = 0
        Timer1.Interval = 1000
        Timer1.Enabled = True
    End Sub

    'Juste un exemple d'une sub car je ne sais pas comment tu reçois ce caractère:
    Private Sub DonnéesRecuesDeLAutomate()
        If Caractere "fin" Then ProgressBar1.Value ProgressBar1.Maximum
        'et tu peux même laisser tourner le timer
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If ProgressBar1.Value < ProgressBar1.Maximum Then ProgressBar1.Value += 1
    End Sub



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 mai 2013 à 19:20
Excusez-moi, mais je persiste à ne pas vouloir "avaler toute crue" cette "solution" avec utilisation d'un timer.
Je ne connais absolument rien à VB.Net, mais serait étonné de ce qu'il n'offre pas du "plus mieux", sinon du "moins pire".
J'ai lu avec attention tous vos messages.
Quel est le problème, finalement ? celui d'aller constamment "jeter un oeil ailleurs" ? Si oui : VB.Net ne connaîtrait-il pas l'opérateur AdressOf ?
Si oui (et je veux le croire) c'est lui, qu'il conviendrait d'utiliser plutôt qu'un Timer, me semble-t-il

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Rejoignez-nous