Task の関数値

関数値をリターンする Task です。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. 0~99の乱数をリターンする Task を定義します。
    このプロジェクトは Windows10 & Visual Studio Community 2015 の環境で Win32 API を使って開発しています。
  2. Main.cpp を次のように修正します。
    #include <ppltasks.h>
    #include <string>
    #include <windows.h>
    
    using namespace concurrency;
    using namespace std;
    
    int wmain()
    {
        task<int> t([]()
        {
            int rnd;
            rnd = GetTickCount() % 500;
            for (int i = 0; i<rnd; i++) rand();
            return rand() % 100;
        });
    
        t.wait();
        wchar_t str[40];
        swprintf(str, 40, L"0~99の乱数: %d\n\n", t.get());
        OutputDebugString(str);
    }
    
  3. task<int> t(・・・) が int 型の値を返すタスクです。
    t.wait(); で実行され、t.get() で関数値を取得します。
  4. rand() は乱数を発生する int 型の関数ですが、初期化しないと何時も同じ値になります。
    そこで GetTickCount() でタイムスタンプをミリ秒で求め、GetTickCount() % 500 の値で初期化します。
    初期化が終わると rand() % 100; で0~99の乱数をリターンします。
    t.wait(); で Task の終了を待って、t.get() で関数値を取得して OutputDebugString() で印字します。
  5. 実行する毎に値が変わるので試して下さい。

Task 関数を定義

  1. 0~99の乱数をリターンする Task を独立した関数として定義します。
    Main.cpp を次のように修正します。
    #include <ppltasks.h>
    #include <string>
    #include <windows.h>
    
    using namespace concurrency;
    using namespace std;
    
    task<int> int_rand()
    {
        int rnd = GetTickCount() % 500;
        return create_task([rnd] 
        {
            for (int i=0; i<rnd; i++)   rand();
            return rand() % 100;
        });
    }
    
    int wmain()
    {
        auto t = int_rand();
        wchar_t str[40];
        swprintf(str, 40, L"0~99の乱数: %d\n\n", t.get());
        OutputDebugString(str);
    }
    
  2. task<int> int_rand() がタスクで実行される関数の定義です。
    auto t = int_rand(); で呼び出されます。
  3. int rnd に乱数を初期化するための値を設定します。
    return create_task(・・・) で Task を設定します。
    Task 関数 int_rand() は return create_task([rnd] { ・・・ }); の実行結果をリターンします。
  4. wmain() では auto t = int_rand(); で Task 関数を呼び出します。
    t.get() で関数値を取得して OutputDebugString() で印字します。

wstring 関数

  1. wstring をリターンする Task を定義します。
    Main.cpp を次のように修正します。
    #include <ppltasks.h>
    #include <string>
    #include <windows.h>
    
    using namespace concurrency;
    using namespace std;
    
    task<wstring> return_string()
    {
        auto s = make_shared<wstring>(L"Return_String");
        return create_task([s]
        {
            wstring str;
            str = L"Value: " + *s + L"\n";
            return str;
        });
    }
    int wmain()
    {
        wstring str;
        auto t = return_string();
        str = L"Final value: " + t.get() + L"\n";
        OutputDebugString(str.data());
    }
    
  2. make_shared は <タイプ> の型に合わせて値を設定する関数です。
    create_task() 関数では、"Value: " と *s と "\n" を連結してリターンします。
  3. wmain() では auto t = return_string(); で Task 関数を呼び出します。
    t.get() で関数値を取得して OutputDebugString() で印字します。

[Next Chapter ↓] パラメータを渡す
[Previous Chapter ↑] Task を起動

超初心者のプログラム入門(C/C++)