Partager via


Comment : utiliser la classe transformer dans un pipeline de données

Cette rubrique contient un exemple de base qui montre comment utiliser la concurrency::transformer classe dans un pipeline de données.Pour obtenir un exemple plus complet qui utilise un pipeline de données pour effectuer le traitement d'image, consultez Procédure pas à pas : création d'un réseau de traitement d'image.

Le traitement « pipeline » de données est un modèle commun dans la programmation simultanée.Un pipeline de données se compose d'une série d'étapes, où chaque étape exécute un travail puis passe le résultat de ce travail à l'étape suivante.La classe transformer est un composant clé dans les pipelines de données car elle reçoit une valeur d'entrée, effectue un travail sur cette valeur, puis produit un résultat utilisable par un autre composant.

Exemple

Cet exemple utilise le pipeline de données suivant pour exécuter une série de transformations étant donné une valeur d'entrée initiale :

  1. La première étape calcule la valeur absolue de son entrée.

  2. La deuxième étape calcule la racine carrée de son entrée.

  3. La troisième étape calcule le carré de son entrée.

  4. La quatrième étape inverse son entrée.

  5. La cinquième étape écrit le résultat final dans un tampon de messages.

Pour finir, l'exemple imprime le résultat du pipeline sur la console.

// data-pipeline.cpp
// compile with: /EHsc
#include <agents.h>
#include <math.h>
#include <iostream>

using namespace concurrency;
using namespace std;

int wmain()
{
   // Computes the absolute value of its input.
   transformer<int, int> t0([](int n) {
      return abs(n);
   });

   // Computes the square root of its input.
   transformer<int, double> t1([](int n) {
      return sqrt(static_cast<double>(n));
   });

   // Computes the square its input.
   transformer<double, int> t2([](double n) {
      return static_cast<int>(n * n);
   });

   // Negates its input.
   transformer<int, int> t3([](int n) {
      return -n;
   });

   // Holds the result of the pipeline computation.
   single_assignment<int> result;

   // Link together each stage of the pipeline.
   // t0 -> t1 -> t2 -> t3 -> result
   t0.link_target(&t1);
   t1.link_target(&t2);
   t2.link_target(&t3);
   t3.link_target(&result);

   // Propagate a message through the pipeline.
   send(t0, -42);

   // Print the result to the console.
   wcout << L"The result is " << receive(result) << L'.' << endl;
}

Cet exemple produit la sortie suivante :

The result is -42.

Il est courant pour une étape dans un pipeline de données de générer une valeur dont le type diffère de sa valeur d'entrée.Dans cet exemple, la deuxième étape prend une valeur de type int comme entrée et produit la racine carrée de cette valeur ( double) comme sortie.

[!REMARQUE]

Le pipeline de données de cet exemple est fourni à titre d'illustration.Étant donné que chaque opération de transformation effectue peu de travail, la surcharge requise pour effectuer le passage de message peut l'emporter sur les avantages que procure l'utilisation d'un pipeline de données.

Compilation du code

Copiez l'exemple de code, collez-le dans un projet Visual Studio et collez-le dans un fichier nommé pipeline.cpp de données , puis exécutez la commande suivante dans une fenêtre d'invite de commande Visual Studio.

cl.exe /EHsc data-pipeline.cpp

Voir aussi

Tâches

Procédure pas à pas : création d'un réseau de traitement d'image

Concepts

Bibliothèque d'agents asynchrones

Blocs de messages asynchrones