Comment : utiliser la classe transformer dans un pipeline de données
Cette rubrique contient un exemple de base qui montre comment utiliser la classe concurrency::transformer 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 :
La première étape calcule la valeur absolue de son entrée.
La deuxième étape calcule la racine carrée de son entrée.
La troisième étape calcule le carré de son entrée.
La quatrième étape inverse son entrée.
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 génère la sortie suivante :
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.
Notes
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 et collez-le dans un projet Visual Studio , ou collez-le dans un fichier nommé data-pipeline.cpp puis exécutez la commande suivante dans une fenêtre d'invite de commandes 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