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 ver un ejemplo más completo que use una canalización para realizar el procesamiento de imágenes, consulte Tutorial: Creación de una red de procesamiento de imagen.

La canalización de datos es un patrón 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 en un archivo denominado data-pipeline.cpp y, después, ejecute el siguiente comando en una ventana del símbolo del sistema de Visual Studio.

cl.exe /EHsc data-pipeline.cpp

Consulte también

Biblioteca de agentes asincrónicos
Bloques de mensajes asincrónicos
Tutorial: Crear una red de procesamiento de imagen