スポンサーリンク

C++/CLIでTask

スレッドは生成・破棄に時間がかかる(下手すりゃ秒単位)。そこでスレッドプール等の運用方法が考案され、効率化が図られてきた。

しかしそれらを実装するのは結構な手間で、プログラマが一々手を煩わせるべきではない。

そのような要望から生まれたのがTaskで、効率的なスレッドの運用を内部で勝手にやってくれる。

 

という事らしい。

参考文献

https://stackoverflow.com/questions/31531697/c-cli-using-iprogress-in-task
https://teratail.com/questions/82895

 

 

using namespace System;
//パラメータ受け渡し用のクラス
public ref class CParam {
public:
  int i;
};
//一つのタスクとなるクラス
public ref class MyClass {
  CParam^ param;
  System::Threading::Tasks::Task^ myTask;
public:
  MyClass(int k) {
    param = gcnew CParam;
    param->i = k;
  }
  void TaskMethod(Object^ obj);//スレッドで走る関数
  void Start();
  void Wait();
};
//スレッドを開始する関数
void MyClass::Start() {
  myTask = System::Threading::Tasks::Task::Factory->StartNew(
    gcnew System::Action<Object^>(this, &MyClass::TaskMethod), (Object^)param);
}

//終了まで待機
void MyClass::Wait() {
  myTask->Wait();
}
//処理本体
void MyClass::TaskMethod(Object^ obj) {
  CParam^ cp = (CParam^)obj;
  for (int j = 0; j < 100; j++) {
    Console::WriteLine(System::String::Format("{0}", cp->i + j));
  }
  
}
/////////////////////////////////////////////////////
int main(array<System::String ^> ^args)
{

  MyClass^ mc1 = gcnew MyClass(100);
  MyClass^ mc2 = gcnew MyClass(200);
  MyClass^ mc3 = gcnew MyClass(300);

  mc1->Start();
  mc2->Start();
  mc3->Start();

  mc1->Wait();
  mc2->Wait();
  mc3->Wait();



  Console::Read();
  return 0;
}

 

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: