le 07-04-2017 06:52 AM
Bonjour cher lecteur,
Imaginons un vi chargé de lancer plusieurs instances d'un même sous-vi à des instants aléatoires. Ce sous-vi qui possède plusieurs instances est un vi dont la seule fonction est celle d'un chronomètre (terme à prendre dans le sens d'une horloge) , c'est à dire qu'il affiche les secondes qui s'écoulent depuis le lancement de cette instance. Le format d'affichage est HH:mm:ss. C'est tout: Pas de résolution sous la seconde. Il n'indique pas l'heure mais bien le temps passé depuis le lancement de l'instance.
>>>Ce que j'observe : Mon problème c'est que, quelques soient les dates en lesquelles les instances sont lancées, les affichages de la durée pour chacune de ces instances sont simultanés ! Les afficheurs battent la seconde de manière synchrone et ça ne correspond pas à la réalité ! Ce résultat laisse croire que les instances ont été lancées avec des retards les unes par rapport aux autres qui seraient systématiquement des multiples de la seconde. Ce qui est bien-sûr faux. Pour être concret si la deuxième instance du sous-vi est lancée 4,5s après que soit lancée la première instance , alors les affichages seront en phase avec un retard de 4 secondes ou 5 secondes (ça c'est normal) je ne sais plus mais en tout cas leur affichage sont en phase, c'est à dire retardés d'un multiple de la seconde (ça ce n'est PAS normal). Pour le dire encore d'une autre façon : les 4 afficheurs sont raffraichis en même temps. Bien-sûr qu'ils n'affichent pas la même valeur mais ils battent la seconde aux mêmes dates.
>>>Ce que je veux observer : Si la seconde instance du sous-vi est lancée 4,5s après que soit lancée la première instance , alors les affichages seront retardés d'une demi-seconde et non pas en phase.
J'ai bien sélectionné la propriéte "synchroniser l'affichage" pour chacun des indicateurs pour que chaque afficheur soit bien raffraîchi dès qu'il reçoit la valeur numérique. (sans , c'est à dire par défaut, ça ne marche pas non plus).
J'ai bien sélectionné "réentrant à mémoire pré-allouée" dans la propriété d'execution du sous-vi.
Mais je crois que c'est davantage une histoire de système d'exécution.
Le cpu possède 4 coeurs avec HyperThreading. (4c/8t). Comment faire pour rendre chacune de ses instances parfaitement asynchrones ? En fait je mesure combien je ne comprends rien à cette organisation des threads , des systèmes d'exécution et des moyens de gérer la parallélisation. Donc si vous avez de la littérature Labview à me conseiller je suis preneur. J'ai consulté l'aide de LV sur les systèmes d'exécution mais je n'ai pas progressé dans mon ignorance. Il faudra quand même que j'aille voir les exemples sur les ré-entrants...
Voici le lanceur:
————————————————————————————————————————
Voici le sous-vi:
Résolu ! Accéder à la solution.
07-04-2017 07:08 AM - modifié 07-04-2017 07:09 AM
Bonjour,
Pour moi le problème vient de ton sous-vi.
Le fait d'utiliser la fonction "attendre un multiple de ms" implique la synchronisation de toutes tes instances sur ton horloge processeur.
Si tu veux constater le phénomène de glissement, il faut que tu utilise la fonction "attendre(ms)".
http://digital.ni.com/public.nsf/allkb/53D27DACCE4855CE86257FB2007922F9
Pour voir ton phénomène, agrandir le temps d'attente, et tu constateras que la 1er itération de ta boucle va prendre une valeur différente de xxx ms afin de se synchroniser sur ton horloge système.
Cdt,
Michael
07-04-2017 07:14 AM - modifié 07-04-2017 07:14 AM
Ah merci Michael C. !!
Mais quel abruti je suis ! En plus je l'utilise jamais ce «wait multiple» mais d'habitude toujours le «wait» c'est d'ailleurs pour ça que l'appelais comme ça dans le titre du sujet. Et là ,énorme faute d'attention !
Merci mille fois ! Effectivement ça marche mieux comme ça !
le 07-04-2017 08:24 AM
Pas de souci, ça arrive à tout le monde..
Quand on a le nez dans le code, il est toujours difficile de prendre du recul 🙂
Et cette fonction est très puissante pour réaliser une synchronisation entre plusieurs instances de manière simplifié sans partir dans des structures cadencés et autre système de synchronisation (rendez vous, sémaphore, ....).
Bonne journée et bon courage pour la suite.