le 10-23-2012 05:49 AM
Bonjour
Un petit soucis avec ma boucle while: j'effectue des mesures de température, donc avec un cadencement très lent (1 boucle/5 minutes). Mon problème est simple: entre le moment où je clique sur le bouton stop et le moment où la boucle s'arrète, il peut s'écouler jusqu'à 5 minutes; je souhaiterai une sortie quasi immédiate de la boucle.
J'ai déja résolu une fois ce problème en rajoutant une boucle for qui me permettait de subdiviser mes 5 minutes en 300 secondes et en vérifiant à chaque seconde l'appui sur le bouton stop... mais c'est un peu lourdingue. Existe-t-il une solution plus esthétique?
Merci d'avance
Philippe
le 10-23-2012 07:09 AM
En utilisant une structure évenement on pourrait faire quelque chose de mieux. Mais j'ai l'impression que pour faire quelque chose de propre il faille refaire pas mal de choses. Donc la solution que vous avez trouvée est snas doute la plus simple (avec le moins de choses à refaire).
le 10-23-2012 10:54 AM
Effectivement, une structure événement dans une boucle While est utile dans ce cas et ne demanderait pas forcément beaucoup de modifs dans le code :
1) Tu mets le code présent dans ta boucle While dans la condition Timeout de la structure événement (ou tu l'exécutes via un sous-VI ou autre chose si c'est trop gros), en définissant la durée du Timeout à la période d'acquisition ;
2) Tu ajoutes une condition d'événement "valeur changée" sur un bouton Stop pour gérer l'arrêt de la boucle While.
Si l'utilisateur ne fait rien, la condition Timeout s'exécute périodiquement et réalise l'acquisition ; s'il appuie sur Stop, la structure événement répond immédiatement et arrête le programme.
HL
le 10-24-2012 02:19 AM
Hello Philippe,
La structure événement peut éventuellement répondre à votre besoin, mais elle est relativement peu élégante. L'événement timeout ne devrait pas être utilisé pour exécuter une tâche telle qu'une acquisition mais plutôt pour gérer une rupture de communication ou une gestion d'erreur. L'avantage : la faible utilisation CPU pendant qu'on attend.
Je joins ma solution sous forme de machine à états : on déclenche un timer dès qu'on fait une mesure (ici 10 secondes), et on vient scruter si le timer est écoulé. Il n'y a donc pas de "famine" à cause d'une attente de 5 minutes puisque le code repose sur le timer.
Cdt,
Eric M. - Senior Software Engineer
Certified LabVIEW Architect - Certified LabVIEW Embedded Systems Developer - Certified LabWindows™/CVI Developer
Neosoft Technologies inc.
10-24-2012 03:25 AM - modifié 10-24-2012 03:30 AM
Le VI attaché au précédent message est en LabVIEW2012 😞
Est-il possible de l'avoir sous une version antérieure (j'en suis resté à la version 2011...) ?
Merci d'avance,
HL
PS. J'utilise régulièrement la fonction Timeout de la structure événement de la façon que j'ai décrite : pour ma part, je trouve que c'est une solution plutôt élégante 😉 Mais bon...
le 10-24-2012 04:00 AM
C'est en effet une solution valide et courante, mais le timeout n'a pas été conçu pour ce genre d'opération, donc c'est moins bien du point de vue programmation pure!
le 10-25-2012 01:49 AM
Le revoilà en 2011 !
Cdt
Eric M. - Senior Software Engineer
Certified LabVIEW Architect - Certified LabVIEW Embedded Systems Developer - Certified LabWindows™/CVI Developer
Neosoft Technologies inc.
le 10-25-2012 06:04 PM
Merci pour le code. Mais, franchement, je ne suis pas convaincu : je trouve que c'est une solution bien lourde pour quelque chose qu'une simple structure événement avec Timeout réalise beaucoup plus simplement et en utilisant moins de ressources ! De plus, la structure événement me semble plus souple pour gérer d'autres interventions qu'un simple arrêt (modification de paramètres, par exemple) entre des tâches périodiques (mesures ou autre chose).
HL
le 12-17-2012 10:07 AM
Bonjour,
J'ai déjà eu ce problème dans le passé.
Je te joins une petite astuce pour faire ce que tu veux.
Cdlt,