Compartilhar via


Como: Use o transformador em um canal de dados

Este tópico contém um exemplo básicas que mostra como usar a classe de concurrency::transformer em um canal de dados.Para um exemplo completo que usa um pipeline de dados para executar o processamento de imagem, consulte Passo a passo: Criando uma rede Processamento de imagens.

O encanamento de dados é um padrão comum em programação simultânea.Um pipeline de dados consiste de uma série de etapas, onde cada estágio executa o trabalho e então passa o resultado desse trabalho para o estágio seguir.A classe que transformer de um componente-chave nos dados canaliza porque recebe um valor de entrada, executa o trabalho nesse valor, e gera um resultado para que outro componente usar.

Exemplo

Este exemplo usa a seguir pipeline de dados para executar uma série de transformações disponíveis um valor inicial de entrada:

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

  2. A segunda etapa calcula a raiz quadrada de sua entrada.

  3. A terceira etapa calcula o quadrado de sua entrada.

  4. Frente a fase nega sua entrada.

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

Finalmente, o exemplo imprime o resultado da 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;
}

Esse exemplo produz a seguinte saída.

  

É comum para um estágio em um canal de dados para produzir um valor cujo tipo é diferente do valor de entrada.Nesse exemplo, a segunda etapa recebe um valor de tipo int como sua entrada e produz a raiz quadrada desse valor () doublecomo sua saída.

ObservaçãoObservação

O pipeline de dados nesse exemplo é para a ilustração.Porque cada operação de transformação executa vez trabalho, a sobrecarga que é necessária para executar mensagem- passar pode aumentar as vantagens 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 em um arquivo denominado data-pipeline.cpp e execute o seguinte comando em uma janela de prompt de comando do Visual Studio.

cl.exe /EHsc data-pipeline.cpp

Consulte também

Tarefas

Passo a passo: Criando uma rede Processamento de imagens

Conceitos

Biblioteca de agentes assíncrono

Blocos assíncronas de mensagem