![]() | 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 :
Dans LabVIEW, tous les appels de VI asynchrones combinent les étapes suivantes.
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 :
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.
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.
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.
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 :
Utile
Pas utile