Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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:
Az első szakasz kiszámítja a bemenet abszolút értékét.
A második szakasz kiszámítja a bemenet négyzetgyökét.
A harmadik szakasz kiszámítja a bemenet négyzetét.
A negyedik szakasz tagadja a bemenetét.
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