Appels asynchrones de VIs

Aide LabVIEW 2014

Date d'édition : June 2014

Numéro de référence : 371361L-0114

»Afficher les infos sur le produit
Télécharger l'aide (Windows uniquement)

Lorsque vous effectuez un appel standard d'un VI cible avec soit un nœud de sous-VI, soit le nœud Appeler par référence, le flux de données s'arrête à ce nœud jusqu'à ce que le VI cible ait renvoyé ses résultats. À ce moment-là, le flux de données reprend à partir des terminaux de sortie du nœud.

Par contre, un appel asynchrone d'un sous-VI démarre l'exécution du sous-VI tout en permettant au flux de données de se poursuivre dans le VI appelant. Vous pourriez vouloir appeler un sous-VI de manière asynchrone si le VI appelant n'a pas immédiatement besoin des résultats du sous-VI. Dans ce cas-là, l'appel asynchrone peut diminuer considérablement la durée de l'exécution du VI appelant en permettant au sous-VI de s'exécuter en parallèle dans le VI appelant. Reportez-vous à la liste suivante pour consulter des exemples de modèles de programmation qui tirent parti des appels de VI asynchrones :

  • Délégation du travail à des sous-VIs tout en continuant de s'exécuter
  • Division du travail d'une tâche entre plusieurs instances du même VI cible, surtout si vous ne savez qu'à l'exécution combien d'instances la tâche requiert
  • Lancement d'interfaces utilisateur complexes dont les éléments sont contrôlés par différents VIs qui doivent s'exécuter en parallèle et recueillir les résultats simultanément


Reportez-vous au VI Benchmarking Asynchronous Calls.vi, dans le répertoire labview\examples\Application Control\VI Server\Asynchronous Call By Reference pour comparer plusieurs approches synchrones et asynchrones permettant d'effectuer la même tâche.

Présentation de la construction d'un appel de VI asynchrone

Dans LabVIEW, tous les appels de VI asynchrones combinent les étapes suivantes.

  1. Préparez une référence de VI à un appel asynchrone — Vous préparez une référence de VI à une exécution asynchrone lorsque vous obtenez la référence avec la fonction Ouvrir une référence de VI et que vous incluez un des marqueurs d'option asynchrones (0x80 ou 0x100) dans l'entrée options. Cette étape permet à LabVIEW d'allouer des ressources à l'appel asynchrone.
  2. Démarrez l'appel de VI asynchrone — Câblez la référence au VI au nœud Démarrer un appel asynchrone pour lancer l'exécution du VI cible. Pendant que le VI cible s'exécute, le flux de données continue dans le VI appelant.
  3. (Facultatif) Recueillez les résultats de l'appel de VI asynchrone — Si votre application requiert les sorties d'un VI cible qu'elle appelle de manière asynchrone, câblez la référence au VI au nœud Attendre un appel asynchrone pour recueillir les résultats. Le nœud Attendre un appel asynchrone attend que le sous-VI associé ait fini de s'exécuter ou jusqu'à ce que le nœud Attendre un appel asynchrone entre en timeout.
  4. Fermez la référence au VI — Utilisez la fonction Fermer une référence pour indiquer à LabVIEW que vous avez fini d'utiliser la référence au VI. LabVIEW peut alors libérer les ressources associées.

Types d'appels de VI asynchrones

Pour effectuer un appel de VI asynchrone, vous devez déterminer lequel des modèles d'usage suivants s'applique à votre cas. Reportez-vous aux rubriques suivantes pour obtenir des informations complémentaires sur l'implémentation de chaque modèle :

  • Appeler et oublier — Un VI appelant lance l'exécution d'un sous-VI mais ne requiert pas de résultats du sous-VI.
  • Appeler et collecter — Un VI appelant lance l'exécution d'un sous-VI et a besoin de recueillir les résultats ultérieurement.


Vous pouvez utiliser l'un ou l'autre de ces modèles pour démarrer plusieurs appels asynchrones au même VI pour une exécution en parallèle.

Comment LabVIEW gère les appels asynchrones : Le pool d'appels asynchrones

Bien que dans la plupart des cas, vous n'avez pas besoin de savoir comment LabVIEW gère les appels de VIs asynchrones pour les utiliser, une certaine compréhension du pool d'appels peut vous aider à contrôler les performances et à concevoir des applications déterministes. Lorsque vous préparez une référence de VI à une exécution asynchrone en incluant un des marqueurs d'option asynchrones dans l'entrée options de la fonction Ouvrir une référence de VI, LabVIEW crée un pool d'espaces de données qui fait le suivi des données des différents appels de ce VI. Comme LabVIEW associe un pool d'espaces de données plutôt qu'un seul espace de données à une référence de VI, vous pouvez démarrer plusieurs appels asynchrones avec la même référence de VI. À chaque fois que vous utilisez le nœud Démarrer un appel asynchrone pour lancer un appel asynchrone avec la référence de VI, LabVIEW réserve un des espaces de données du pool. Lorsque le VI finit de s'exécuter, LabVIEW stocke ses sorties dans l'espace de données et marque l'appel de VI comme étant terminé. Si le nœud Attendre un appel asynchrone attend les sorties du VI appelé, LabVIEW renvoie les résultats de l'espace de données, ce qui libère l'espace de données pour un autre appel du même VI.

Effets d'un pool d'appels asynchrones sur les performances

Pour chaque référence de VI, LabVIEW crée un espace de données dans le pool d'appels asynchrones pour chaque cœur de processeur sur l'ordinateur cible. Si vous démarrez plus d'appels simultanés du VI cible qu'il n'y a d'espaces de données disponibles, LabVIEW augmente la taille du pool de données en allouant des espaces de données supplémentaires. Comme le processus d'allocation d'espaces de données ne prend pas une durée déterministe, le VI appelant risque de subir un délai imprévisible à chaque nœud Démarrer un appel asynchrone qui déclenche une allocation.

Comment éviter des délais imprévisibles au nœud Démarrer un appel asynchrone

Pour éviter des délais imprévisibles dans les VIs qui doivent s'exécuter sous un système d'exploitation temps réel, préallouez le nombre d'espaces de données dans le pool d'appels d'un VI donné en appelant la méthode Remplir le pool d'appels asynchrones avant de démarrer des appels asynchrones. En préallouant les espaces de données, les délais surviennent au début du programme au lieu de se produire au nœud Démarrer un appel asynchrone.

Reportez-vous au VI Populating the Asynchronous Call Pool.vi, dans le répertoire labview\examples\Application Control\VI Server\Asynchronous Call By Reference pour obtenir des informations complémentaires sur l'effet des pools d'appels asynchrones sur les performances.

Effet d'un pool d'appels asynchrones sur la collecte des sorties de plusieurs appels du même VI

Lorsque vous voulez recueillir les résultats d'un appel de VI asynchrone, vous devez passer la référence au VI appelé au nœud Attendre un appel asynchrone. Comme le nœud Attendre un appel asynchrone reçoit une référence à un VI plutôt qu'une référence à un espace de données spécifique, le nœud ne peut pas recueillir les sorties d'un appel spécifique du VI référencé. Par contre, le nœud renvoie les sorties de n'importe quel appel de ce VI terminé. Reportez-vous au diagramme suivant pour une explication plus détaillée de ce comportement.

Comme les étiquettes le suggèrent, si plusieurs nœuds Attendre un appel asynchrone dépendent de la même référence de VI, vous ne pouvez pas prédire quel nœud renverra les résultats d'un appel particulier de cette référence de VI. Dans le diagramme précédent, le nœud Attendre un appel asynchrone du haut est susceptible de renvoyer les résultats de Démarrer un appel asynchrone 2 bien qu'il soit câblé à Démarrer un appel asynchrone 1. Si vous voulez effectuer plusieurs appels du même VI tout en gardant le nœud Démarrer un appel asynchrone apparié à un nœud Attendre un appel asynchrone spécifique, utilisez l'une des solutions suivantes :

  • Créez une référence de VI unique au VI cible pour chaque appel asynchrone. Si un nœud Attendre un appel asynchrone partage une référence de VI unique avec un nœud Attendre un appel asynchrone, il ne fait aucun doute que les deux nœuds font référence à la même instance du VI. Cette solution est similaire à la collecte des sorties de plusieurs appels de références de VI uniques.
  • Modifiez le VI cible pour qu'il accepte un nombre ou une chaîne unique comme entrée et qu'il renvoie le même identificateur comme sortie. Lorsque vous appelez le VI cible de manière asynchrone, comparez l'identificateur que vous passez à un nœud Démarrer un appel asynchrone à celui renvoyé par le nœud Attendre un appel asynchrone. S'ils sont identiques, vous savez quel appel le nœud Attendre un appel asynchrone a renvoyé.

CET ARTICLE VOUS A-T-IL ÉTÉ UTILE ?

Pas utile