Aracılığıyla paylaş


Nasıl yapılır: Veri Ardışık Düzeninde transformer Kullanma

Bu konu, bir veri işlem hattında concurrency::transformer sınıfının nasıl kullanılacağını gösteren temel bir örnek içerir. Görüntü işleme gerçekleştirmek için veri işlem hattı kullanan daha eksiksiz bir örnek için bkz . İzlenecek Yol: Görüntü İşleme Ağı Oluşturma.

Veri kanalı oluşturma , eşzamanlı programlamada yaygın olarak kullanılan bir desendir. Veri işlem hattı, her aşamanın çalışma gerçekleştirdiği ve ardından bu çalışmanın sonucunu bir sonraki aşamaya geçirdiği bir dizi aşamadan oluşur. Bir transformer giriş değeri aldığı, bu değer üzerinde çalışma gerçekleştirdiği ve ardından başka bir bileşenin kullanması için bir sonuç ürettiği için veri işlem hatlarındaki bir anahtar bileşeni sınıfı.

Örnek

Bu örnekte, ilk giriş değeri verilen bir dizi dönüştürme gerçekleştirmek için aşağıdaki veri işlem hattı kullanılır:

  1. İlk aşama, girişinin mutlak değerini hesaplar.

  2. İkinci aşama, girişinin karekökünü hesaplar.

  3. Üçüncü aşama, girişinin karesini hesaplar.

  4. Sonraki aşama, girişini olumsuzleştirir.

  5. Beşinci aşama, son sonucu bir ileti arabelleğine yazar.

Son olarak, örnek işlem hattının sonucunu konsola yazdırır.

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

Bu örnek aşağıdaki çıkışı oluşturur:

The result is -42.

Veri işlem hattındaki bir aşamanın türü giriş değerinden farklı olan bir değerin çıkışını oluşturması yaygın bir durumdur. Bu örnekte, ikinci aşama giriş olarak tür int değerini alır ve çıkış olarak bu değerin karekökünü (a double) üretir.

Dekont

Bu örnekteki veri işlem hattı çizim içindir. Her dönüştürme işlemi çok az iş gerçekleştirdiğinden, ileti geçirme gerçekleştirmek için gereken ek yük, veri işlem hattı kullanmanın avantajlarından daha ağır basabilir.

Kod Derleniyor

Örnek kodu kopyalayıp bir Visual Studio projesine yapıştırın veya adlı data-pipeline.cpp bir dosyaya yapıştırın ve ardından bir Visual Studio Komut İstemi penceresinde aşağıdaki komutu çalıştırın.

cl.exe /EHsc data-pipeline.cpp

Ayrıca bkz.

Zaman Uyumsuz Aracılar Kitaplığı
Zaman Uyumsuz İleti Blokları
İzlenecek yol: Görüntü İşleme Ağı Oluşturma