Como: Transformador de uso em um Pipeline de dados

Este tópico contém um exemplo básico que mostra como usar o Concurrency::transformer a classe em um pipeline de dados. Para um exemplo mais completo que usa um pipeline de dados para executar o processamento de imagem, consulte Demonstra Passo a passo: A criação de uma rede de processamento de imagens.

O pipelining de dados é um padrão comum na programação simultânea. Um pipeline de dados consiste em uma série de estágios, onde cada estágio realiza o trabalho e, em seguida, passa o resultado desse trabalho para o próximo estágio. O transformer classe um componente-chave nos dados tubulações porque ele recebe um valor de entrada, executa o trabalho nesse valor e produz um resultado para outro componente para uso.

Exemplo

Este exemplo usa o pipeline de dados a seguir para executar uma série de transformações, dado um valor de entrada inicial:

  1. O primeiro estágio calcula o valor absoluto de entrada.

  2. O segundo estágio calcula a raiz quadrada de entrada.

  3. Terceiro estágio calcula o quadrado de sua entrada.

  4. O estabelecidos estágio anula a sua entrada.

  5. O quinto estágio grava o resultado final para um buffer de mensagem.

Finalmente, o exemplo imprime o resultado do pipeline para o 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.

The result is -42.

É comum para um estágio em um pipeline de dados para um valor cujo tipo difere de seu valor de entrada de saída. Neste exemplo, o segundo estágio leva a um valor do tipo int como entrada e produz a raiz quadrada desse valor (um double) como saída.

ObservaçãoObservação

O pipeline de dados neste exemplo é para fins ilustrativos. Como cada operação de transformação realiza um pouco de trabalho, sobrecarga necessária para executar a passagem de mensagens pode pesar sobre os benefícios do uso de um pipeline de dados.

Compilando o código

Copie o código de exemplo e colá-lo em um Visual Studio do projeto, ou colá-lo em um arquivo que é chamado pipeline.cpp de dados e, em seguida, execute o seguinte comando um Visual Studio 2010 janela do Prompt de comando.

cl.exe /EHsc data-pipeline.cpp

Consulte também

Conceitos

Biblioteca de agentes assíncronos

Blocos de mensagens assíncronas

Outros recursos

Demonstra Passo a passo: A criação de uma rede de processamento de imagens