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

Toto téma obsahuje základní příklad, který ukazuje použití třídy concurrency::transformer v datovém kanálu. Podrobnější příklad, který používá datový kanál k provádění zpracování obrázků, najdete v tématu Návod: Vytvoření sítě pro zpracování obrázků.

Předávání dat je běžným vzorem při souběžné programování. Datový kanál se skládá z řady fází, kde každá fáze provádí práci a pak předává výsledek této práce do další fáze. Třída transformer klíčovou komponentu v datových kanálech, protože přijímá vstupní hodnotu, provádí práci na této hodnotě a potom vytvoří výsledek pro použití jiné součásti.

Příklad

Tento příklad používá následující datový kanál k provedení řady transformací s počáteční vstupní hodnotou:

  1. První fáze vypočítá absolutní hodnotu vstupu.

  2. Druhá fáze vypočítá druhou odmocninu vstupu.

  3. Třetí fáze vypočítá druhou mocninu vstupu.

  4. Fáze vysudí svůj vstup.

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

Příklad nakonec vypíše výsledek kanálu 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.

U fáze datového kanálu je běžné výstup hodnoty, jejíž typ se liší od vstupní hodnoty. V tomto příkladu druhá fáze přebírá jako vstup hodnotu typu int a jako výstup vytvoří druhou odmocninu této hodnoty (a double).

Poznámka

Datový kanál v tomto příkladu je určen pro ilustraci. Vzhledem k tomu, že každá operace transformace provádí malou práci, režie potřebná k provádění předávání zpráv může převažovat nad výhodami používání datového kanálu.

Probíhá kompilace kódu

Zkopírujte ukázkový kód a vložte ho do projektu sady Visual Studio nebo ho vložte do pojmenovaného data-pipeline.cpp souboru a potom v okně příkazového řádku sady Visual Studio spusťte následující příkaz.

cl.exe /EHsc data-pipeline.cpp

Viz také

Knihovna asynchronních agentů
Asynchronní bloky zpráv
Návod: Vytvoření sítě pro zpracování obrázků