Udostępnij za pośrednictwem


Porady: używanie transformatora w potoku danych

Ten temat zawiera prosty przykład, który pokazuje, jak używać concurrency::transformer klasy w potoku danych.Aby uzyskać bardziej rozbudowany przykład wykorzystuje rurociąg danych do przetwarzania obrazu, zobacz Wskazówki: tworzenie sieci przetwarzania obrazów.

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

Przykład

W tym przykładzie użyto następujących rurociąg danych do wykonania szeregu przekształceń, biorąc pod uwagę wartość wejściowa:

  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. Dalej etap neguje jego wprowadzania.

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

Wreszcie w przykładzie drukuje wynik potoku 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:

  

To jest wspólne dla etapu w potoku dane wyjściowe wartości, której typem różni się od jego wartości wejściowej.W tym przykładzie drugiego etapu ma wartość typu int jako własnych danych wejściowych i produkuje pierwiastek kwadratowy wartości ( double) jako dane wyjściowe.

[!UWAGA]

Rurociąg danych w tym przykładzie jest do celów informacyjnych.Ponieważ każda operacja transformacji wykonuje mało pracy, obciążenie wymagane do wykonania przekazywania wiadomości można przewyższają korzyści z używania rurociąg 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 uruchomić następujące polecenie w oknie wiersza polecenia programu Visual Studio.

cl.exe /EHsc data-pipeline.cpp

Zobacz też

Zadania

Wskazówki: tworzenie sieci przetwarzania obrazów

Koncepcje

Biblioteka agentów asynchronicznych

Bloki komunikatów asynchronicznych