#include <iostream>
#include <string>
#include <chrono>
#include <thread>
#include <future>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/highgui/highgui_c.h>
using namespace cv;
using namespace std::chrono;
Mat getImg()
{
Mat img = imread("z.png");
return img;
}
std::string fetchDataFromDB(std::string recvData) {
//确保函数要5秒才能执行完成
std::this_thread::sleep_for(seconds(5));
//处理创建数据库连接、获取数据等事情
return "DB_" + recvData;
}
std::string fetchDataFromFile(std::string recvData) {
//确保函数要5秒才能执行完成
std::this_thread::sleep_for(seconds(5));
//处理获取文件数据
return "File_" + recvData;
}
int main() {
//获取开始时间
system_clock::time_point start = system_clock::now();
//异步程序程序
std::future<Mat> resultFromDB = std::async(std::launch::async, getImg);
Mat async_img = resultFromDB.get();
//从数据库获取数据
std::string dbData = fetchDataFromDB("Data");
//从文件获取数据
std::string fileData = fetchDataFromFile("Data");
//获取结束时间
auto end = system_clock::now();
auto diff = duration_cast<std::chrono::seconds>(end - start).count();
std::cout << "Total Time taken= " << diff << "Seconds" << std::endl;
//组装数据
std::string data = dbData + " :: " + fileData;
//输出组装的数据
std::cout << "Data = " << data << std::endl;
return 0;
}
这里std::async 为异步处理程序,getImg为需要异步处理的函数名,如有参数,用“,”隔开。
std::future<Mat> resultFromDB = std::async(std::launch::async, getImg);
如:
函数为:
int pusher(Mat color_image, SwsContext *vsc, AVFrame *yuv, AVCodecContext *vc,
AVFormatContext *ic, AVPacket pack, AVStream *vs)
调用示例:
std::future<int> push_img_to_pad = std::async(std::launch::async, pusher, color_image, vsc, yuv, vc, ic, pack, vs);
int async_img = push_img_to_pad.get();