Udostępnij za pośrednictwem


Jak: wykorzystanie transformer planowanej danych

Ten temat zawiera przykład podstawowego, który pokazuje, jak użyć concurrency::transformer klasy w rurociągu danych.Aby uzyskać bardziej rozbudowany przykład wykorzystuje rurociąg dane do przetwarzania obrazu, zobacz Instruktaż: Tworzenie sieci przetwarzania obrazu.

Przetwarzanie potokowe danych jest wspólnego wzorca w współbieżnym.Rurociąg danych składa się z szeregu etapów, gdzie każdy etap wykonuje pracę, a następnie przekazywać wynik tej pracy do następnego etapu.transformer Klasy rurociągi kluczowy element danych, ponieważ otrzymuje wartość wejściowa, wykonuje pracę na wartość, a następnie daje wynik dla innego składnika użyć.

Przykład

Przykład używa następujących rurociąg danych do wykonania szeregu przekształcenia danej początkowe wartości wejściowe:

  1. Pierwszy etap oblicza wartość bezwzględna jego wprowadzania.

  2. Drugi etap oblicza pierwiastek kwadratowy z jego wprowadzania.

  3. Trzeci etap oblicza kwadrat jego wprowadzania.

  4. Do przodu etapie podważa jego wprowadzania.

  5. Piąty etap zapisuje wynik końcowy bufor komunikatów.

Wreszcie przykład drukuje wynik rurociąg do konsoli.

// 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;
}

Ten przykład generuje następujące wyniki:

The result is -42.

Jest wspólne dla etapu w rurociągu danych do wyprowadzenia wartość, której typ różni się od wartości wejściowych.W tym przykładzie drugiego etapu przyjmuje wartości typu int jako swojego wejścia i produkuje pierwiastek kwadratowy wartości ( double) jako dane wyjściowe.

[!UWAGA]

Rurociąg danych w tym przykładzie jest na ilustracji.Ponieważ każda operacja transformacji wykonuje pracę little, obciążenie wymagane do wykonywania przekazywania wiadomości można przeważy korzyści z za pomocą rurociągów danych.

Kompilowanie kodu

Skopiuj przykładowy kod i wklej go w projekcie programu Visual Studio lub wkleić go w pliku o nazwie danych pipeline.cpp , a następnie uruchom następujące polecenie w oknie wiersza polecenia usługi programu Visual Studio.

cl.exe /EHsc data-pipeline.cpp

Zobacz też

Zadania

Instruktaż: Tworzenie sieci przetwarzania obrazu

Koncepcje

Biblioteka agentów asynchroniczne

Asynchroniczne blokuje wiadomości