Compartir a través de


Cómo: Usar la clase transformer en una canalización de datos

Este tema contiene un ejemplo básico que muestra cómo usar la clase Concurrency::transformer en una canalización de datos. Para obtener un ejemplo más completo en el que usa una canalización de datos para realizar el procesamiento de imágenes, vea Tutorial: Crear una red de procesamiento de imagen.

La canalización de datos es un modelo frecuente en la programación simultánea. Una canalización de datos se compone de una serie de fases donde en cada fase se realiza un trabajo y, a continuación, se pasa el resultado de ese trabajo a la siguiente fase. La clase transformer es un componente clave de la canalización de datos porque recibe un valor de entrada, realiza un trabajo en dicho valor y, a continuación, genera un resultado que otro componente va a usar.

Ejemplo

En este ejemplo se usa la canalización de datos siguiente para realizar una serie de transformaciones a partir de un valor de entrada inicial especificado:

  1. En la primera fase se calcula el valor absoluto de la entrada.

  2. En la segunda fase se calcula la raíz cuadrada de la entrada.

  3. En la tercera fase se calcula el cuadrado de la entrada.

  4. En la cuarta fase se calcula el valor negativo de la entrada.

  5. En la quinta fase se escribe el resultado final en un búfer de mensajes.

Finalmente, el ejemplo imprime el resultado de la canalización en la consola.

// 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;
}

Este ejemplo produce el siguiente resultado:

The result is -42.

Es frecuente que una fase de una canalización de datos dé como resultado un valor cuyo tipo difiere del valor de entrada. En este ejemplo, en la segunda fase se toma un valor de tipo int como entrada y se genera la raíz cuadrada de ese valor (un valor de tipo double) como resultado.

Nota

La canalización de datos de este ejemplo corresponde a la ilustración. Dado que cada operación de transformación realiza poco trabajo, la sobrecarga necesaria para realizar el paso de mensajes puede sobrepasar las ventajas de usar una canalización de datos.

Compilar el código

Copie el código de ejemplo y péguelo en un proyecto de Visual Studio o péguelo en un archivo denominado data-pipeline.cpp y, a continuación, ejecute el siguiente comando en una ventana del símbolo del sistema de Visual Studio 2010.

cl.exe /EHsc data-pipeline.cpp

Vea también

Conceptos

Biblioteca de agentes asincrónicos

Bloques de mensajes asincrónicos

Otros recursos

Tutorial: Crear una red de procesamiento de imagen