close

首先google c++ async找到c++撰寫非同步範例

image


std::async 基本用法

std::async 可以看成是 std::threads 的一個高階介面,它可以用來將比較耗時的工作分給多個執行緒平行計算,算完之後再取回結果,提高整個程式的執行效能,而其語法與 std::threads 相較之下又更單純許多,絕大部分需要平行化的 C++ 應用程式通常都會比較適合採用 std::async



image


在這段程式中,我們定義了一個 is_prime 這個檢查一個整數是否為質數的函數,而這個函數執行起來會需要比較久的時間,因此我們利用 std::async 這個非同步的方式呼叫 is_prime,並傳入 334214467 這個參數給 is_prime,讓它在另外一個執行緒中進行計算,而我們在主執行緒中就可以處理其他的工作,等到真正需要 is_prime 的計算結果時,再以 std::future 所提供的介面將計算的結果取回。


測試結果

image


依照上面撰寫一個非同步儲存影像功能

專案名稱: LibAsynSave

標頭檔案: LibAsynSave.h

   1: #pragma once
   2: #ifndef LIBASYNC
   3: #define LIBASYNC
   4: #include <opencv2/opencv.hpp>
   5: #endif
   6:  
   7: using namespace cv;
   8: namespace FileIO
   9: {
  10:     bool SaveImageRoutine(String FilePath, Mat img);
  11:     void SaveImage(String filePath, Mat img);
  12: }

實作檔案: LibAsynSave.cpp

   1: #include "stdafx.h"
   2: #include "LibAsynSave.h"
   3: #include <future>
   4: #include <iostream>
   5: namespace FileIO
   6: {
   7:     bool SaveImageRoutine(String filePath, Mat img)
   8:     {
   9:         try {
  10:             imwrite(filePath, img);
  11:         }
  12:         catch (Exception exception)
  13:         {
  14:             return false;
  15:         }
  16:         return true;
  17:     }
  18:     void SaveImage(String filePath, Mat img)
  19:     {
  20:         std::future<bool> fut = std::async(SaveImageRoutine, filePath, img);
  21:     }
  22: }

由於此專案產生的函式庫必須為C#呼叫使用,所以必須選擇/clr

image

但是很不幸的事情發生

錯誤    C1189    #error:  <future> is not supported when compiling with /clr or /clr:pure.    

google搜尋老半天,大家的建議都是不要選擇/clr,

但是此專案偏偏得支援/clr才能讓C#呼叫使用…..@@







這就是撰寫程式最有挑戰的地方~~~~~~~~~~~~~~~~~~~~~~~~呼!




 












參考資料

1. C++ 使用 Async 非同步函數開發平行化計算程式教學

arrow
arrow
    全站熱搜

    me1237guy 發表在 痞客邦 留言(0) 人氣()