Compartilhar via


Como usar transformador em um pipeline de dados

Este tópico contém um exemplo básico que mostra como usar a classe de concurrency::transformer em um pipeline de dados. Para um mais o exemplo completo que usa um pipeline de dados para executar o processamento de imagem, consulte Instruções passo a passo: criando uma rede de processamento de imagem.

O indicação de dados é um padrão comum em programação simultâneo. Um pipeline de dados consiste em uma série de etapas, em que cada fase executa o trabalho e passar o resultado do trabalho para o estágio seguir. A classe de transformer um componente fundamental nos dados canaliza como recebe um valor de entrada, execute o trabalho nesse valor, e gerenciado em um resultado para que outro componente usar.

Exemplo

Este exemplo usa a seguinte pipeline de dados para executar uma série de transformações fornecidas um valor de entrada inicial:

  1. A primeira fase calcula o valor absoluto de sua entrada.

  2. A segunda etapa calcula a raiz quadrada da entrada.

  3. A terceira fase computa o quadrado de sua entrada.

  4. Se a fase nega a entrada.

  5. A quinta fase grava o resultado final para um buffer de mensagem.

Finalmente, o exemplo a seguir imprime o resultado de pipeline no 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;
}

Este exemplo gera a seguinte saída:

  

É comum para uma fase em um pipeline de dados para gerar um o valor cujo tipo seja diferente do valor de entrada. Neste exemplo, a segunda etapa usa um valor do tipo int como entrada e gerencie a raiz quadrada desse valor double() como sua saída.

Dica

O pipeline de dados neste exemplo é para ilustração.Como cada operação de transformação executa vez trabalho, a sobrecarga necessária para executar mensagem- passar pode aumentar os benefícios de usar um pipeline de dados.

Compilando o código

Copie o código de exemplo e cole-o em um projeto do Visual Studio, ou cole-o em um arquivo chamado data-pipeline.cpp e execute o comando a seguir em uma janela de prompt de comando do Visual Studio.

cl.exe /EHsc data-pipeline.cpp

Consulte também

Tarefas

Instruções passo a passo: criando uma rede de processamento de imagem

Conceitos

Biblioteca de Agentes Assíncronos

Blocos de mensagens assíncronos