Sdílet prostřednictvím


Jak: Použití transformátoru dat potrubí

Toto téma obsahuje základní příklad, který ukazuje, jak použít concurrency::transformer třídy dat potrubí.Úplnější příklad, který používá data potrubí provádět zpracování obrazu, viz Názorný postup: Vytváření sítě zpracování obrazu.

Použití kanálů data je společný vzorek v souběžné programování.Data potrubí sestává z řady fází, kde každé fáze vykonává práci a potom předá výsledky práce do další fáze.transformer Třídy klíčovou součástí dat potrubí, protože obdrží vstupní hodnotu provádí práci na hodnotu a potom vytvoří výsledek pro použití jiné komponenty.

Příklad

V tomto příkladu je následující data potrubí provést posloupnost transformací původní vstupní hodnoty:

  1. První etapa vypočítá absolutní hodnota jeho vstup.

  2. Druhá etapa vypočítá druhou odmocninu vstupní.

  3. Vypočítá třetí etapy Čtvereček vstupní.

  4. Tam Neguje fázi jeho vstup.

  5. Pátá fáze konečný výsledek zapíše na vyrovnávací paměť pro zprávy.

Nakonec příklad vytiskne výsledek potrubí do konzoly.

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

Tento příklad vytvoří následující výstup:

The result is -42.

Je běžné pro fázi potrubí dat výstup hodnotu, jehož typ se liší od jeho vstupní hodnotu.V tomto příkladu druhé etapě má hodnotu typu int jako vstupní a vytváří druhou odmocninu hodnoty ( double) jako svůj výstup.

[!POZNÁMKA]

Potrubí data v tomto příkladu je pro ilustraci.Protože každý transformační operaci provádí málo práce, režie je požadována pro provedení předávání zpráv můžete převažují výhody použití dat potrubí.

Probíhá kompilace kódu

Příklad kódu zkopírujte a vložte do projektu Visual Studio nebo vložit do souboru s názvem data pipeline.cpp a spusťte následující příkaz v okně příkazového řádku Visual Studio.

cl.exe /EHsc data-pipeline.cpp

Viz také

Úkoly

Názorný postup: Vytváření sítě zpracování obrazu

Koncepty

Asynchronní agenti knihovny

Asynchronní bloků zprávy