线程队列: libuv,window 可在libuv官网下载相应版本

opencv:  编译的时候opencv的位数要和 node的bit 一致

兼容electron :  node-gyp rebuild --version   --Debug/--Release  --archs=x64/ia32

v8文档: https://v8docs.nodesource.com/

#include <node.h>
#include <v8.h>
#include <uv.h>
#include <windows.h>
#include <string.h>
#include <string>
#include <iostream>
#include <thread>
#include <opencv/cv.h>
#include <opencv2/opencv.hpp> using namespace v8;
// 传入了两个参数,args[0] 字符串,args[1] 回调函数s
struct SImageData {
int status = -;
int width = ;
int height = ;
int channels = ;
int size = ;
int step = ;
std::vector<int> data;
std::string msg; //msg
}; void hello(const FunctionCallbackInfo<Value>& args) {
// 使用 HandleScope 来管理生命周期s
Isolate* isolate = Isolate::GetCurrent();
HandleScope scope(isolate); // 判断参数格式和格式s
if (args.Length() < || !args[]->IsString()) {
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "Wrong arguments")));
return;
} // callback, 使用Cast方法来转换s
Local<Function> callback = Local<Function>::Cast(args[]);
Local<Value> argv[] = {
// 拼接String
String::Concat(Local<String>::Cast(args[]), String::NewFromUtf8(isolate, " world"))
};
// 调用回调, 参数: 当前上下文,参数个数,参数列表s
callback->Call(isolate->GetCurrentContext()->Global(), , argv);
}
//三个参数 图片路径,目标图片宽度, 返回值: 图像参数,数据流s
void getImageData(const FunctionCallbackInfo<Value>& args){
Isolate* isolate = args.GetIsolate(); SImageData sData;
// 参数长度判断s
/*
if (args.Length() < 3) {
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "Wrong params of arguments")));
return ;
}
*/
// js String 类型转换成 v8 String 类型s
Local<String> filepath = Local<String>::Cast(args[]);
String::Utf8Value filePath(filepath);
// js Number 类型转换成 v8 Number 类型s
Local<Number> dstWidth = Local<Number>::Cast(args[]);
printf("%s %f\n", *filePath, dstWidth->NumberValue()); cv::Mat srcImg = cv::imread(std::string(*filePath));
cv::Mat img;
int width = srcImg.cols;
int height = srcImg.rows;
//图片压缩s
int r_width = width;
int r_height = r_width * height / width; resize(srcImg, img, cv::Size(r_width, r_height), , , );
// 获取图片流信息
int channels = img.channels();
uchar* buffer = img.data;
width = img.cols;
height = img.rows;
//printf("width = %d\n;height = %d\n;channels = %d\n;step = %d\n",width, height, channels, step);
int size = width * channels * height;
sData.data.clear();
/*
for (int i = 0; i < size; i += channels) {
int r = buffer[i];
int g = buffer[i + 1];
int b = buffer[i + 2];
sData.data.push_back(r);
sData.data.push_back(g);
sData.data.push_back(b);
}
*/
sData.status = ;
sData.width = img.cols;
sData.height = img.rows;
sData.size = size;
sData.step = img.step;
sData.channels = channels; //c++ -> js
Local<Object> obj = Object::New(isolate);
// Number type
Local<Number> jsStatus = Number::New(isolate, sData.status);
Local<Number> jsWidth = Number::New(isolate, sData.width);
Local<Number> jsHeight = Number::New(isolate, sData.height);
Local<Number> jsSize = Number::New(isolate, sData.size);
Local<Number> jsStep = Number::New(isolate, sData.step);
Local<Number> jsChannels = Number::New(isolate, sData.channels); obj->Set(String::NewFromUtf8(isolate, "status"), jsStatus);
obj->Set(String::NewFromUtf8(isolate, "width"), jsWidth);
obj->Set(String::NewFromUtf8(isolate, "height"), jsHeight);
obj->Set(String::NewFromUtf8(isolate, "size"), jsSize);
obj->Set(String::NewFromUtf8(isolate, "step"), jsStep);
obj->Set(String::NewFromUtf8(isolate, "channels"), jsChannels); //args.GetReturnValue().Set(obj);
// callback, 使用Cast方法来转换s
Local<Function> callback = Local<Function>::Cast(args[]);
const unsigned argc = ;
Local<Value> argv[argc] = { obj };
//cb->Call(Null(isolate), argc, argv);
// 调用回调, 参数: 当前上下文,参数个数,参数列表s
callback->Call(isolate->GetCurrentContext()->Global(), argc, argv);
}
//async
//在AddOn中,定义一个结构体在异步调用中传递数据s
struct LookupIpCountryBaton {
uv_work_t work; //libuv
Persistent<Function> callback; //javascript callback <heap> int type;
}; void lookupIpCountryAsync(uv_work_t * work){
LookupIpCountryBaton * baton = (LookupIpCountryBaton*)work->data; // block thread for 3 seconds
Sleep();
// save the result
baton->type = ;
} void lookupIpCountryCompleted(uv_work_t * work, int){
LookupIpCountryBaton * baton = (LookupIpCountryBaton*)work->data;
Isolate * isolate = Isolate::GetCurrent();
HandleScope handleScope(isolate);
const unsigned argc = ;
Local<Value> argv[argc] = {String::NewFromUtf8(isolate, "HHEE")};
Local<Function>::New(isolate, baton->callback)->Call(isolate->GetCurrentContext()->Global(), argc, argv); baton->callback.Reset();
delete baton; }
//导出方法首先保存回调函数,并验证和解析传入参数s
// lookup country by ip
// 1st argument is ip address
// 2nd argument is the callback function
void lookupIpCountry(const FunctionCallbackInfo<Value>& args) {
Isolate *isolate = args.GetIsolate();
Local<Context> context = isolate->GetCurrentContext();
HandleScope scope(isolate);
if (args.Length() < ) {
isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Wrong params of arguments")));
return ;
} LookupIpCountryBaton * baton = new LookupIpCountryBaton();
baton->work.data = baton;
baton->type = ; //baton->callback = Persistent<Function>::New(Handle<Function>::Cast(args[1]));
baton->callback.Reset(isolate, Local<Function>::Cast(args[])); uv_queue_work( uv_default_loop(), &baton->work, lookupIpCountryAsync, lookupIpCountryCompleted); return ;
} // 相当于在 exports 对象中添加 { hello: hello }
void init(Handle<Object> exports) {
NODE_SET_METHOD(exports, "hello", hello);
NODE_SET_METHOD(exports, "getImageData", getImageData);
NODE_SET_METHOD(exports, "delay", lookupIpCountry);
} // 将 export 对象暴露出去s
// 原型 `NODE_MODULE(module_name, Initialize)`s
NODE_MODULE(opencv_image, init);

C++ Addon Async 异步机制的更多相关文章

  1. 深入理解Spring的异步机制

    一.Spring中实现异步执行 在这里我先以事件的机制举例,注意默认情况下事件的发布与监听都是同步执行的.那么我们来看一看基于异步事件的例子该怎么写 首先还是定义事件: package com.bdq ...

  2. spring boot(17)-@Async异步

    验证码的异步机制 上一篇讲过可以用邮件发验证码,通常我们在某网站发验证码时,首先会提示验证码已发送,请检查邮箱或者短信,这就是图中的1和3.然而此时查看邮箱或短信可能并没有收到验证码,往往要过几秒种才 ...

  3. Windows store app[Part 4]:深入WinRT的异步机制

    接上篇Windows store app[Part 3]:认识WinRT的异步机制 WinRT异步机制回顾: IAsyncInfo接口:WinRT下异步功能的核心,该接口提供所有异步操作的基本功能,如 ...

  4. Windows store app[Part 3]:认识WinRT的异步机制

    WinRT异步机制的诞生背景 当编写一个触控应用程序时,执行一个耗时函数,并通知UI更新,我们希望所有的交互过程都可以做出快速的反应.流畅的操作感变的十分重要. 在连接外部程序接口获取数据,操作本地数 ...

  5. 异步编程系列第01章 Async异步编程简介

    p { display: block; margin: 3px 0 0 0; } --> 2016.10.11补充 三个月过去了,回头来看,我不得不承认这是一系列失败的翻译.过段时间,我将重新翻 ...

  6. 结合源码看nginx-1.4.0之nginx异步机制详解

    目录 0. 摘要 1. nginx异步设计思想 2. nginx异步设计数据结构 3. nginx异步机制源码解析 4. 一个简单的应用异步例子 5. 小结 6. 参考源码

  7. JavaScript的异步机制

    我们经常说JS是单线程的,比如node.js研讨会上大家都说JS的特色之一是单线程的,这样使JS更简单明了,可是大家真的理解所谓JS的单线程机制吗?单线程时,基于事件的异步机制又该当如何 1 先看下两 ...

  8. JavaScript单线程和异步机制

    随着对JavaScript学习的深入和实践经验的积累,一些原理和底层的东西也开始逐渐了解.早先也看过一些关于js单线程和事件循环的文章,不过当时看的似懂非懂,只留了一个大概的印象:浏览器中的js程序时 ...

  9. @Async异步注解与SpringBoot结合使用

    当你在service层需要启动异步线程去执行某些分支任务,又不希望显式使用Thread等线程相关类,只想专注于实现业务逻辑代码开发,可以使用@Async异步注解. 1. 使用@Async 异步注解 C ...

随机推荐

  1. [原创]浅谈Web UI自动化测试

    [原创]浅谈Web UI自动化测试 Web UI自动化测试相信大家都不陌生,今天来谈谈这个,我最早接触自动化测试时大约是在2004年,2006年当时在腾讯财付通算是开始正式接触自动化测试,之所以是正式 ...

  2. iOS:解决UITextView自适应高度粘贴大量文字导致显示不全的问题

    一.描述 在UITextView输入框中粘贴大量的文字时,UITextView内容自适应高度计算出现误差,导致整块文字上移消失. 二.方案 在UITextView文字改变的监听中添加如下方法即可. [ ...

  3. Net Core 的配置模式以及热重载配置

    https://www.cnblogs.com/Leo_wl/p/8527535.html https://blog.csdn.net/ma_jiang/article/details/5350198 ...

  4. ionic中android的返回键

    ionic中android的返回键 在ionic框架中已经注册了几个返回事件,分别是 view sideMenu modal actionSheet popup loading 他们的优先级分别是 v ...

  5. Python 进制转换 二进制 八进制 十进制 十六进制

    Python 进制转换 二进制 八进制 十进制 十六进制 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/python3-scale.html 全局定义一定不 ...

  6. Linux下通过server-status监控性能

    Linux下通过server-status监控性能 前提:安装好Apache,在opt/路径下 查看Apache的工作模式 可以知道是 prefork.c模式 配置server-status 性能 进 ...

  7. Redis面试刁难大全

    转自:https://mp.weixin.qq.com/s?__biz=MzI0MzQyMTYzOQ==&mid=2247483686&idx=1&sn=18dfa0fd08b ...

  8. LNMP环境的搭建(yum)方法(精)

    第一 先安装nginx nginx在官方CentOS社区yum里面没有,需要在nginx的官方网站去下载yum的配置文件 官方:https://www.nginx.com/resources/wiki ...

  9. Atitit s2018.5 s5 doc list on com pc.docx  v2

    Atitit s2018.5 s5  doc list on com pc.docx  Acc  112237553.docx Acc Acc  112237553.docx Acc baidu ne ...

  10. 获取CPU序列号的Delphi程序

    Unit CPUid; Interface Type TCpuType = (cpu8086, cpu286, cpu386, cpu486, cpuPentium); Function CpuTyp ...