Megosztás a következőn keresztül:


Útmutató: Transformer használata adatcsővezetékben

Ez a témakör egy egyszerű példát tartalmaz, amely bemutatja, hogyan használható a konkurencia::transformer osztály egy adatfolyam folyamatban. A teljesebb példa, amely egy adatfolyamot használ a képfeldolgozáshoz, tekintse meg az útmutatót: Image-Processing hálózat létrehozása.

Az adatcsövés gyakori minta az egyidejű programozásban. Az adatfolyamok több szakaszból állnak, ahol minden fázis végez munkát, majd átadja a munka eredményét a következő fázisnak. Az transformer adatfolyamok kulcsösszetevőjének osztálya, mivel bemeneti értéket kap, ezen az értéken dolgozik, majd egy másik összetevő számára hoz létre eredményt.

példa

Ez a példa a következő adatfolyamatot használja az átalakítások sorozatának végrehajtásához egy kezdeti bemeneti érték alapján:

  1. Az első szakasz kiszámítja a bemenet abszolút értékét.

  2. A második szakasz kiszámítja a bemenet négyzetgyökét.

  3. A harmadik szakasz kiszámítja a bemenet négyzetét.

  4. A negyedik szakasz tagadja a bemenetét.

  5. Az ötödik szakasz egy üzenetpufferbe írja a végeredményt.

Végül a példa a folyamat eredményét a konzolra nyomtatja.

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

Ez a példa a következő kimenetet hozza létre:

The result is -42.

Az adatfolyam egy szakasza gyakran olyan értéket ad ki, amelynek típusa eltér a bemeneti értékétől. Ebben a példában a második fázis bemenetként egy típusértéket int vesz fel, és ennek az értéknek a négyzetgyökét ( doublea ) állítja elő kimenetként.

Megjegyzés:

A példában szereplő adatfolyam illusztráció. Mivel minden átalakítási művelet kevés munkát végez, az üzenetátadás végrehajtásához szükséges többletterhelés meghaladhatja az adatfolyamatok használatának előnyeit.

A kód összeállítása

Másolja ki a példakódot, és illessze be egy Visual Studio-projektbe, vagy illessze be egy elnevezett data-pipeline.cpp fájlba, majd futtassa a következő parancsot egy Visual Studio parancssori ablakban.

cl.exe /EHsc data-pipeline.cpp

Lásd még

Aszinkron ügynökök könyvtára
Aszinkron üzenetblokkok
Útmutató: Image-Processing-hálózat létrehozása