Sdílet prostřednictvím


Postupy: Použití transformace v datovém kanálu

Toto téma obsahuje základní příklad, který ukazuje, jak použít concurrency::transformer třídy datového kanálu.Úplnější příklad, který používá data kanálu zpracování obrazu, viz Návod: Vytvoření sítě pro zpracování obrázků.

Použití datových kanálů je společný vzorek v souběžné programování.Kanál dat sestává z řady stádií, kde každé fázi práce provádí a potom předá výsledek této 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 tuto hodnotu a potom vytvoří výsledek pro jiné komponenty, které chcete použít.

Příklad

Tento příklad používá můžete provést posloupnost transformací nastavena na počáteční hodnotu vstupního potrubí následující data:

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

  2. Druhá etapa vypočítá druhou odmocninu z jeho vstup.

  3. Třetí etapa počítá buňky jeho vstup.

  4. Tam Neguje fázi jeho vstup.

  5. Pátá fáze konečný výsledek zapíše do vyrovnávací paměti 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:

  

Je běžné pro fázi v kanálu data na výstup hodnoty, jejichž typ se liší od jeho vstupní hodnotu.V tomto příkladu druhá etapa má hodnotu typu int jako vstup a vytváří druhou odmocninu hodnoty ( double) jako výstup.

[!POZNÁMKA]

Kanál dat v tomto příkladu je pro ilustraci.Vzhledem k tomu, že každá operace transformace provádí málo práce, tedy režie požadované k provedení předávání zpráv předčit výhody použití datového kanálu.

Probíhá kompilace kódu

Zkopírovat ukázkový kód a vložit jej do projektu sady Visual Studio nebo vložit do souboru s názvem dat pipeline.cpp a potom spusťte následující příkaz v okně Příkazový řádek Visual Studio.

cl.exe /EHsc data-pipeline.cpp

Viz také

Úkoly

Návod: Vytvoření sítě pro zpracování obrázků

Koncepty

Knihovna asynchronních agentů

Asynchronní bloky zpráv