#副標=Visual Studio 2010開發平台 (6) #大標=Visual C++ 2010與平行運算支援 #關鍵字:VS2010、C++、Library #作者=王寧疆 ===========box 範例1 ============ #include #include using namespace Concurrency; ==============end=============== ===========box 範例2 ============ concurrent_vector IntCV; //宣告能夠被多個工作同時存取的集合 ==============end=============== ===========box 範例 3============ parallel_invoke([&IntCV] { //找出1~1000之間的奇數的工作 CString s; //宣告存放結果字串的變數 for (int i=1;i<=1000;i++) //處理1~1000之間的數字   { if (i % 2 != 0) //如果除以2的餘數不等於0 { s.Format(_T("%d是奇數!"), i); //所處理的數字是奇數 IntCV.push_back(s); //將結果字串加入到IntCV集合 } } }, [&IntCV] { //找出1~1000之間的偶數的工作 CString s; //宣告存放結果字串的變數 for (int i=1;i<=1000;i++) //處理1~1000之間的數字    { if (i % 2 == 0) //如果除以2的餘數等於0 { s.Format(_T("%d是偶數!"), i); //所處理的數字是偶數 IntCV.push_back(s); //將結果字串加入到IntCV集合 } } } ); m_ListBox1.ResetContent(); //清除ListBox控制項目前顯示的內容 for (int i=0;i IntCV; //宣告能夠被多個工作同時存取的集合 ==============end=============== ===========box 範例5 ============ parallel_for(1, 101, [&](int n) //處理1~100之間的數字 { CString s; //存放結果字串的變數 s.Format(_T("%d的平方%d"), n, n * n); //將數字執行平方運算後的結果準備成字串內容 IntCV.push_back(s);  //將準備好的字串存入concurrent_vector集合 }); ==============end=============== ===========box 範例6 ============ m_ListBox2.ResetContent(); //清除ListBox控制項目前顯示的內容 for (int i=0;i IntCV; //宣告能夠被多個工作同時存取的集合 task_group tg; //宣告task_group類別的變數 tg.run([&IntCV] {//呼叫task_group類別的run方法執行判斷奇數的工作 CString s; //宣告存放結果字串的變數 for (int i=1;i<=1000;i++) //處理1~1000之間的數字 { if (i % 2 != 0) //如果除以2的餘數不等於0    { s.Format(_T("%d是奇數!"), i); //所處理的數字是奇數 IntCV.push_back(s); //將結果字串加入到IntCV集合 } }   } ); tg.run([&IntCV] { //呼叫task_group類別的run方法執行判斷偶數的工作  CString s; //宣告存放結果字串的變數 for (int i=1;i<=1000;i++) //處理1~1000之間的數字 { if (i % 2 == 0)   //如果除以2的餘數等於0 { s.Format(_T("%d是偶數!"), i); //所處理的數字是偶數 IntCV.push_back(s); //將結果字串加入到IntCV集合 } } } ); task_group_status status=tg.wait(); //呼叫task_group類別的wait方法等待平行運算的工作結束 if (status==completed) //判斷平行運算工作是否完成 { m_ListBox3.ResetContent(); //清除ListBox控制項目前顯示的內容 for (int i=0;i IntCV; //宣告支援平行存取的concurrent_vector集合的變數 task_group *CancellableTaskGroup; //宣告task_group類別的指標 ==============end=============== ===========box 範例9 ============ IntCV.clear(); //清除concurrent_vector集合的內容 if (CancellableTaskGroup != 0) //如果task_group類別的物件是否已經建立 delete CancellableTaskGroup;  //刪除已經建立的task_group類別的物件 ==============end=============== ===========box 範例 10============ CancellableTaskGroup=new task_group; //建立task_group類別的物件 CancellableTaskGroup->run([&] { //呼叫task_group類別的run方法執行判斷奇數的工作   CString s; //宣告存放結果字串的變數   for (int i=1;i<=1000;i++)   //處理1~1000之間的數字 { Sleep(10); //延遲0.01秒 if (CancellableTaskGroup->is_canceling()) //如果平行運算工作被取消 { break; //結束處理迴圈 } else { if (i % 2 != 0) //如果除以2的餘數不等於0 { s.Format(_T("%d是奇數!"), i);        //所處理的數字是奇數 IntCV.push_back(s);        //將結果字串加入到IntCV集合 } } } ); CancellableTaskGroup->run([&] { //呼叫task_group類別的run方法執行判斷偶數的工作 CString s; //宣告存放結果字串的變數 for (int i=1;i<=1000;i++) //處理1~1000之間的數字 { Sleep(50); //延遲0.05秒 if (CancellableTaskGroup->is_canceling()) //如果平行運算工作被取消 { break; //結束處理迴圈 } else { if (i % 2 == 0) //如果除以2的餘數等於0 { s.Format(_T("%d是偶數!"), i);       //所處理的數字是偶數 IntCV.push_back(s); //將結果字串加入到IntCV集合 } } } } ); ==============end=============== ===========box 範例 11============ CancellableTaskGroup->cancel(); //取消平行運算中的工作 m_ListBox4.ResetContent(); //清除ListBox控制項目前顯示的內容 for (int i=0;i