首先google c++ async找到c++撰寫非同步範例
std::async
基本用法
std::async
可以看成是 std::threads
的一個高階介面,它可以用來將比較耗時的工作分給多個執行緒平行計算,算完之後再取回結果,提高整個程式的執行效能,而其語法與 std::threads
相較之下又更單純許多,絕大部分需要平行化的 C++ 應用程式通常都會比較適合採用 std::async
。
在這段程式中,我們定義了一個 is_prime
這個檢查一個整數是否為質數的函數,而這個函數執行起來會需要比較久的時間,因此我們利用 std::async
這個非同步的方式呼叫 is_prime
,並傳入 334214467
這個參數給 is_prime
,讓它在另外一個執行緒中進行計算,而我們在主執行緒中就可以處理其他的工作,等到真正需要 is_prime
的計算結果時,再以 std::future
所提供的介面將計算的結果取回。
測試結果
依照上面撰寫一個非同步儲存影像功能
專案名稱: 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
但是很不幸的事情發生
錯誤 C1189 #error: <future> is not supported when compiling with /clr or /clr:pure.
google搜尋老半天,大家的建議都是不要選擇/clr,
但是此專案偏偏得支援/clr才能讓C#呼叫使用…..@@
這就是撰寫程式最有挑戰的地方~~~~~~~~~~~~~~~~~~~~~~~~呼!
參考資料
留言列表