Réentrance : autorisation d'appels simultanés au même sous-VI
- Mise à jour2025-08-27
- Temps de lecture : 8 minute(s)
Par défaut, LabVIEW configure les VIs pour une exécution non réentrante. Dans une exécution non réentrante, si un VI est appelé simultanément comme sous-VI par plusieurs autres VIs, un seul de ces appels peut atteindre le sous-VI et l'exécuter à un moment donné. LabVIEW assure que les appelants du sous-VI non réentrant attendent leur tour pour utiliser le sous-VI. Un VI non réentrant n'a qu'un seul espace de données pour stocker les paramètres de ses appelants, les valeurs temporaires calculées lors de l'exécution, et tout état maintenu par le VI non réentrant entre les appels. Cependant, si vous configurez un VI pour une exécution réentrante, LabVIEW peut passer au VI réentrant et l'exécuter simultanément à partir de tous les appelants. Dans une exécution réentrante, LabVIEW alloue plusieurs instances, ou clones, de l'espace de données, de sorte que chaque site d'appels, ou utilisation du sous-VI sur le diagramme de l'appelant, peut s'exécuter simultanément, en parallèle, en utilisant son propre clone.
Types d'exécution réentrante
LabVIEW fournit les types suivants de VIs réentrants :
- Exécution non réentrante : LabVIEW alloue un seul espace de données qui sera utilisé par toutes les instances du sous-VI.
- Exécution réentrante avec copies partagées : LabVIEW alloue un pool de clones, doté d'un clone au départ, à partager entre les appelants. Lorsqu'un appelant appelle un VI clone partagé, il retire le clone du pool et l'y remet à la fin de l'appel. Si le pool est vide quand un appelant appelle un VI clone partagé, LabVIEW crée un nouveau clone pour cet appel et le place dans le pool à la fin de l'exécution, agrandissant ainsi le pool de clones.
- Exécution réentrante avec copies préallouées : LabVIEW alloue un clone distinct qui ne peut pas être partagé à chaque utilisation du sous-VI.
Pour configurer les paramètres de réentrance d'un VI, reportez-vous à la page Exécution de la boîte de dialogue Propriétés du VI.
Sélection du type d'exécution réentrante à utiliser
| Considérations d'utilisation | Pas de réentrance | Réentrance avec copies partagées | Réentrance avec copies préallouées |
|---|---|---|---|
| Capacité de maintenir l'état, tel que dans les registres à décalage non initialisés | Maintient une seule instance de l'espace de données et utilise son état pour tous les sites d'appels. | Ne maintient pas l'état : Chaque site d'appels récupère l'espace de données d'un clone aléatoire du pool de clones. Des sites d'appels peuvent finir par partager l'état. | Maintient l'état pour chaque site d'appels : Chaque site d'appels a son propre clone. |
| Déterminisme pour les VIs appelants multiples et simultanés | Il se peut que les sites d'appels attendent leur tour derrière d'autres appelants simultanés : Le temps requis pour qu'une instance d'un sous-VI commence à s'exécuter varie en fonction du nombre d'instances qui doivent s'exécuter avant elle. | Attente possible : Les sites d'appels doivent attendre que LabVIEW crée un nouveau clone si le pool est vide. Si le pool n'est pas vide, retirer un clone et le remettre dans le pool peut introduire des délais non déterministes. | Pas d'attente : LabVIEW alloue un clone pour chaque site d'appels avant l'exécution. Ceci permet une utilisation de la mémoire et une vitesse d'exécution déterministes. |
| Temps système dû aux appels quand il n'y a pas de VIs appelant simultanément | Moyen : LabVIEW doit vérifier s'il y a des appelants simultanés. | Le plus élevé : LabVIEW doit retirer les clones et les remettre un par un dans le pool de clones. Les appels risquent de devoir attendre que LabVIEW ajoute un clone au pool. | Le plus faible : LabVIEW a déjà préalloué un clone à chaque site d'appels. |
| Utilisation de la mémoire | Minimale : LabVIEW n'alloue qu'un seul espace de données au sous-VI. | Moyenne : LabVIEW ne doit allouer des copies qu'au nombre maximum d'instances s'exécutant simultanément. | Maximale : LabVIEW doit allouer une copie à chaque instance du sous-VI. |
| Remarque (Module FPGA) Les VIs réentrants à copies partagées et à copies préallouées se comportent de la même manière lorsqu'ils sont utilisés dans des VIs FPGA. |
Appels asynchrones de plusieurs instances d'un VI réentrant
Reportez-vous à la rubrique Appels asynchrones de plusieurs instances d'un VI pour une exécution en parallèle pour obtenir des informations sur les appels asynchrones de VIs réentrants.
Affichage de la face-avant de la copie d'un VI réentrant
Chaque copie a une face-avant individuelle. Pour afficher la face-avant quand la copie n'est pas en cours d'exécution, double-cliquez sur l'instance du sous-VI pour lequel vous souhaitez afficher la face-avant. Vous pouvez aussi définir le VI réentrant pour qu'il ouvre sa face-avant au cours de l'exécution. La barre de titre de ce sous-VI contient (clone) afin d'indiquer qu'il s'agit d'une copie plutôt que du VI d'origine. Pour accéder au VI d'origine à partir de la copie, sélectionnez Affichage»Parcourir les relations»Éléments réentrants. Vous pouvez également utiliser la méthode Face-avant:Ouvrir au sein du sous-VI pour ouvrir par programmation la face-avant de chaque copie en cours d'exécution. La barre de titre de ce sous-VI contient (clone) afin d'indiquer qu'il s'agit d'une copie du VI source.
Vous pouvez interagir avec la face-avant d'un VI réentrant de la même manière qu'avec la face-avant d'un VI non réentrant, notamment de l'une des manières suivantes :
- Configuration d'une structure Événement pour gérer des événements pour des objets de la face-avant
- Utilisation de la face-avant comme face-avant secondaire
- Utilisation de propriétés et méthodes pour configurer des commandes et indicateurs
Exemples d'exécution réentrante
Les deux sections suivantes décrivent des exemples de VIs réentrants qui attendent et ne partagent pas de données.
Exécution simultanée d'instances de sous-VIs
Le diagramme suivant alerte l'utilisateur quand son Heure du déjeuner et son Heure de pause arrivent. Cependant, le paramètre de réentrance du VI Alarm Timer est critique pour produire des résultats précis.
| L'utilisateur spécifie une Heure du déjeuner et une Heure de pause. Dans le contexte de cet exemple, considérons que l'Heure du déjeuner est 12h00 et l'Heure de pause est 10h00. |
| Le VI Alarm Timer attend jusqu'à l'heure spécifiée en entrée. Dans la mesure où les instances du VI Alarm Timer apparaissent dans des parties parallèles du diagramme, il est impossible de prédire quelle instance s'exécute en premier. Dans le contexte de cet exemple, considérons que le chronomètre Heure du déjeuner s'exécute en premier. |
Si le VI Alarm Timer est configuré pour une exécution non réentrante, le chronomètre Heure de pause ne peut pas démarrer son exécution avant 12h00 car il doit attendre que le chronomètre Heure du déjeuner finisse son exécution. Ce délai empêche le chronomètre Heure de pause de déclencher une alarme à 10h00. Par conséquent, pour s'assurer que les deux instances du sous-VI puissent s'exécuter simultanément et déclencher leur alarme à l'heure appropriée, vous pouvez configurer le VI Alarm Timer pour qu'il utilise l'un des types d'exécution réentrante.
Stockage des données entre divers appels de chaque instance d'un sous-VI
Pour maintenir l'état entre les appels d'un sous-VI à partir d'un site d'appels spécifique, vous devez utiliser l'exécution réentrante avec copies préallouées. Par exemple, vous créez un VI MoyExp, qui calcule une moyenne exponentielle courante des quatre derniers points de données qui ont été transférés au VI. LabVIEW peut maintenir les quatre points de données les plus récents en tant qu'état dans un registre à décalage non initialisé dans une boucle While à une itération.
Un autre VI utilise le sous-VI MoyExp pour calculer la moyenne glissante de deux voies d'acquisition de données. Le VI surveille la tension à deux points d'un processus et affiche la moyenne exponentielle glissante sur un graphe déroulant. Le diagramme du VI contient deux instances du sous-VI MoyExp. Les appels se font en alternance : un pour la voie 0, puis un pour la voie 1. Supposons que la voie 0 s'exécute en premier. Si le sous-VI MoyExp n'est pas réentrant, l'appel pour la voie 1 utilise la moyenne calculée par l'appel pour la voie 0, et l'appel pour la voie 0 utilise la moyenne calculée par l'appel pour la voie 1. En transformant le sous-VI MoyExp en sous-VI réentrant, chaque appel peut s'exécuter indépendamment sans partager de données.
Redéfinition des paramètres de réentrance de sous-VIs dans des structures cadencées
(Real-Time, Windows) Vous pouvez configurer LabVIEW pour préallouer ou partager des copies d'un VI réentrant à clones partagés dans une structure boucle cadencée ou séquence cadencée. Par exemple, si vous placez un VI réentrant à clones partagés dans une structure boucle cadencée ou séquence cadencée, vous pouvez définir la structure pour qu'elle préalloue les copies aux instances du VI réentrant que vous appelez dans la structure. Les instances du VI réentrant que vous appelez en dehors de la structure continuent de partager les copies. Pour définir l'allocation d'un VI dans une boucle cadencée ou une structure Séquence cadencée, faites un clic droit sur la structure, sélectionnez Allocation de clones partagés et sélectionnez une des options suivantes :
- Automatique : LabVIEW décide si la structure doit être définie à Préallouer ou Allouer selon les besoins en fonction du contexte de la structure. LabVIEW se charge d'ajouter l'élément du menu contenant le texte qui indique le paramètre choisi. Par exemple, si LabVIEW choisit Préallouer, l'élément du menu sera Automatique (Préallouer).
- Préallouer : LabVIEW crée un VI clone pour chaque appel au VI réentrant à l'intérieur de la structure. La boucle cadencée ou la structure Séquence cadencée affiche une icône
pour indiquer que LabVIEW préalloue des clones à chaque VI réentrant de la structure. - Allouer selon les besoins : LabVIEW ne crée le VI clone que lorsque vous appelez le VI réentrant dans la structure. La boucle cadencée ou la structure Séquence cadencée affiche une icône
pour indiquer que LabVIEW partage les clones entre tous les VIs réentrants de la structure.
Mise au point de VIs réentrants
Pour procéder à la mise au point d'un VI réentrant, sélectionnez Fichier»Propriétés du VI pour afficher la boîte de dialogue Propriétés du VI, sélectionnez ensuite Exécution dans le menu déroulant et cochez la case Autoriser la mise au point.
Pour mettre au point une instance spécifique d'un VI ayant des copies préallouées, ouvrez l'instance du sous-VI. Bien que vous ne puissiez pas modifier la copie du VI, vous pouvez utiliser le diagramme de cette copie à des fins de mise au point. Par exemple, vous pouvez placer des points d'arrêt, utiliser des sondes, activer l'animation de l'exécution et exécuter le VI en mode pas à pas.
Pour mettre au point une instance d'un VI qui partage des copies, placez des points d'arrêt, des sondes et l'animation de l'exécution au sein du VI source, et non dans la copie du VI. Les copies de VIs ne conservent pas ces paramètres entre appels.
| Remarque Quand vous mettez au point des applications et des bibliothèques partagées, vous ne pouvez pas mettre au point des faces-avant réentrantes qui ont été créées par la fonction Ouvrir une référence de VI. De même, vous ne pouvez pas mettre au point des faces-avant réentrantes qui servent de points d'entrée à des bibliothèques partagées LabVIEW. |