1

順番にstd::vector< concurrency::task<void> >ロードされる場合とロードされない場合があるタスクのリストがあります。電話に出くわしましたconcurrency::when_anyが、その使用方法について十分な情報がありません。

呼び出し (ScenarioInput1.xaml.cpp:100) を使用するこの Microsoft サンプルに遭遇しましたが、pair パラメーターと、それを戻り値に適応させる方法がわかりません。

編集:私がやろうとしていること:

struct TaskInfo {
  unsigned int                    uniqueId;
  concurrency::task<unsigned int> task;
};
typedef std::vector< TaskInfo > TaskList;
typedef std::vector< unsigned int > TaskReturns;


// Somewhere inside a class, tasks and finished are member variable.
TaskList tasks;
bool finished = false;

// Inside a member function of the same class as above
// Populate the tasks

concurrency::when_any( tasks.begin(), tasks.end() ).then([this](std::vector<unsigned int> ids){
  for( std::vector<unsigned int>::iterator list=ids.begin; list != ids.end(); ++ids ) {
    // a mutex lock would happen here
    for( TaskList::iterator allTasks = tasks.begin(); allTasks != tasks.end(); ++allTasks ) {
      if ( *list == allTasks->uniqueId ) { tasks.erase( allTasks ); break; }
    }
    // mutex unlock
    if ( tasks.size() == 0 ) { finished = true; break }
  }
}

// In another member function
if ( finished ) doOtherThings();

私がやろうとしていることがよく考えられていない、または効率的でない場合は、お知らせください。

4

2 に答える 2

4

タスクの「選択」の組み合わせです。継続 (then)、結合 (when_all)、選択 (when_any) があります。 ドキュメントは言う...

引数として指定されたタスクのいずれかが正常に完了すると、正常に完了するタスクを作成します。

詳細については、タスク クラスC++での非同期プログラミングを参照してください。 より多くの議論と例

たとえば、次のとおりです。

task<string> tasks[] = {t1, t2, t3};
auto taskResult =  when_all (begin(tasks), end(tasks))
    .then([](std::vector<string> results) {

... と同等です ...

(t1 && t2 && t3).then

一方 ...

task<string> tasks[] = {t1, t2, t3};
auto taskResult = when_any (begin(tasks), end(tasks))
    .then([](string result) {

... と同等です ...

(t1 || t2 || t3).then
于 2013-02-14T23:25:51.327 に答える
1

Hans Passant がこのリンクを提供してくれましwhen_any( ... ).then([]( <params> )std::pair<returnType, size_t index>

于 2013-02-15T15:53:15.397 に答える