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:
A primeira etapa calcula o valor absoluto de sua entrada.
A segunda etapa calcula a raiz quadrada de sua entrada.
A terceira etapa calcula o quadrado de sua entrada.
Frente a fase nega sua entrada.
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çã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