在 c++非同步儲存影像 – Part I 我們提到一個問題
錯誤 C1189 #error: <future> is not supported when compiling with /clr or /clr:pure.
解法思路:
另外創建一個專案LibAsynSaveCLR(支援CLR)
基本上這個新專案是封裝上一個LibAsynSave專案(不支援CLR)
在LibAsynSaveCLR專案屬性->其他include目錄
加入前一個專案LibAsynSave的目錄,後面步驟會引入該專案的標頭檔案
在LibAsynSaveCLR專案加入參考LibAsynSave專案
這步驟相當於選擇LibAsynSave專案的函式庫
標頭檔案: LibAsynSaveCLR.h
必須額外加入”LibAsynSave.h”,
這個步驟很重要,不然LibAsnSaveCLR專案無法呼叫之前LibAsynSave寫好的非同步存檔功能
萬一你找不到LibAsynSave.h應該是在前面"其他include目錄"步驟,忘記加入LibAsynSave專案的資料夾路徑
1: #pragma once
2: #ifndef LIBASYNCCLR
3: #define LIBASYNCCLR
4: #include "LibAsynSave.h"
5: #endif
6:
7: namespace Files
8: {
9: void AsynSaveImage(String fileName, Mat img);
10: }
接下看實作部分
LibAsynSaveCLR.cpp
之前非同步存檔是存在於FileIO命名空間因此必須先引用,這樣才能呼叫SaveImage函式
為了方便區別LibAsynSaveCLR專案和LibAsynSave專案,
所以在此另外新增一個Files命名空間給LibAsynSaveCLR專案
1: #include "stdafx.h"
2: #include "LibAsynSaveCLR.h"
3:
4: using namespace FileIO;
5: namespace Files
6: {
7: void AsynSaveImage(String fileName, Mat img)
8: {
9: SaveImage(fileName, img);
10: }
11: }
編譯後順利產生LibAsynSave.lib和LibAsynSaveCLR.lib
複製LibAsynSave.lib和LibAsynSaveCLR.lib至另一個c++ LibIPCam專案(支援CLR)的目錄下
LibIPCam專案屬性設定”其他include目錄”,必須加入LibAsynSaveCLR和LibAsynSave兩個目錄
LibIPCam專案屬性設定”連結器”->”輸入”->"其他相依性",
加入 LibAsynSaveCLRLib和LibAsynSave.lib
在主專案LibIPCam的標頭檔案加入
#include "LibAsynSaveCLR.h"
同時引入
using namespace Files;
如此才能呼叫AsynSaveImage這個函式(支援CLR專案)
LibIPCam專案中,呼叫方式如下:
// 非同步儲存影像
AsynSaveImage(fileName, img.clone());
傳入fileName(檔案儲存路徑)以及影像來源(img)
就可以以非同步方式儲存影像,
最大好處就是不會讓即時影像串流因為儲存檔案速度太慢,
而卡住主執行緒(影響原有的影像接收)。