目的
因为经常用第三方库,调试时候我不想复制Dll到运行目录,所以希望找到一个办法解决库的问题。
解决过程
设置path=你自己的文件夹目录;
多个用分号分开即可。
补充:
向日葵远程操作的时候vs无法显示,可以在选项里面
如果可用,请使用硬件加速,这个选项关闭即可
技术,软件,生活
因为经常用第三方库,调试时候我不想复制Dll到运行目录,所以希望找到一个办法解决库的问题。
设置path=你自己的文件夹目录;
多个用分号分开即可。
补充:
向日葵远程操作的时候vs无法显示,可以在选项里面
如果可用,请使用硬件加速,这个选项关闭即可
c++ 标准库基本没有考虑业务开发,偏离业务太远,对于开发者太不友好,我之前想在使用websocket ,但标准库没有,找了第三方库好久,发现不知道选什么好,c++库引用又不方便,必须编译成自己使用版本,对于我这个老手嫌麻烦,对新手不知道怎么办了.
这个库已经有10几年了,而且代码开发都是现代c++,代码可读性非常好,开发时候可以学习一下,我都不知道标准库代码为什么写成那样子,基本没有可读性,感觉自带混淆。。POCO 基本涵盖所有方面,加密,压缩,网络,转码 ,json,等等基本想到都有。
https://github.com/pocoproject/poco
里面写了
自己必须自己安装cmake,我自己用cmake编译的,因为我直接点击sin工程编译总是编译失败,所以建议cmake,这里默认编译64位,windows开发大多数32位,目前我感觉不到64位程序的优势。
对于c++ windows 开发人来说,不怎么喜欢写命令编译,POCO 貌似有商业版本了,不过我们免费版本就可以了,基本涉及大部分业务。不得不佩服老外毅力,这个东西能写10几年维护,不得不说我们太多缺少这些精神,我们大部分一切只是为了利益。。。
我以前只认为node js 只能单线程,我自己用了一段时间electron 桌面开发,如果遇到CPU密集型业务怎么做呢?我不可能只靠一个CPU来搞业务啊,这个限制不是太大了?
child_process
等模块创建多进程
这种打补丁方法不是很好,涉及进程通信,写代码效率不高,很容易出现bug。开发者很可能出现变量无法访问的问题,因为多个进程,变量没有共享。不过业务写很分开,也问题不大,多进程资源比较大。
worker_threads
真正用的是多线程,我自己写代码测试,不停创建worker_threads..
测试代码
const { Worker, isMainThread, parentPort } = require('worker_threads');
console.log("hello world:" + isMainThread)
/*if (isMainThread) {
// This code is executed in the main thread and not in the worker.
// Create the worker.
const worker = new Worker(__filename);
// Listen for messages from the worker and print them.
worker.on('message', (msg) => {
console.log(msg);
});
} else {
// This code is executed in the worker and not in the main thread.
// Send a message to the main thread.
parentPort.postMessage('Hello world!');
}*/
function test(){
if(isMainThread){
console.log("自动线程哦");
const worker = new Worker("./work.js");
}
}
setInterval(() => {
test();
}, 1000);
通过定时器不停创建工程线程。
work.js
const { isMainThread, parentPort,Worker, threadId } = require('worker_threads');
const min = 2
const max = 1e7
function generatePrimes(start, range) {
let primes = []
let isPrime = true
let end = start + range
for (let i = start; i < end; i++) {
for (let j = min; j < Math.sqrt(end); j++) {
if (i !== j && i%j === 0) {
isPrime = false
break
}
}
if (isPrime) {
primes.push(i)
}
isPrime = true
}
return primes
}
console.log("线程id:" + threadId)
generatePrimes(1, 10000000)
console.log("线程id:" + threadId + " 完成")
可以通过资源管理器查看线程【默认不显示,自己设置一下】,线程数不停增加
可以不停增加,因为我这个写法,会很快把cpu吃死。。。。如果像以前nodejs 普通写法,最多只能吃一个CPU..
注意在线程里面不要直接访问对象,毕竟node js 模式就是异步+主线程,引入多线程导致更多问题,多线程仅仅执行,然后丢回主线程即可。
我之前写一个工具用来客户端加载网页,同时可以注入js,增加功能,类似chrome 浏览器扩展逻辑,但由于网页总是新建一个窗口,我虽然用JS 注入,修改了所有 a 标签的 。但对于动态的无能为力,除非定时器不停遍历,但性能不好,于是就想从electron入手。
自己网络查找一些有关的信息,找到一个new-window 事件,这个事件可以捕获新建窗口逻辑。
one_plugin_ui.webContents.on('new-window',(event, url, frameName, disposition, options, additionalFeatures)=>{
log.debug("new")
one_plugin_ui.loadURL(url) //在当前窗口打开,如果不想打开,完全想拦截,可以通过url 判断,然后不跳转URL
event.preventDefault()
})
因为要做一个简单解析和生成代码,方便自己使用,不想用protobuf工具的生成cpp文件,觉得稍微麻烦一点,因为我只要简单解析和生成。不想写proto 文件。
【自用工具】协议分析工具,进制转换,protobuf反序列化 - 『精品软件区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
Protobuf Decoder (protobuf-decoder.netlify.app)
这种二进制协议一般都要有标志和数据长度,可以说基本属性(虽然长度可以用分割符号来区别,以前传奇就是一个特殊符号来进行数据包切割)。
protobuf 编码格式: klv 对应key length value ,其实这么看没有特别。我们自己定义协常常这样子。
key: tag << 3 | wire_type 这样子生成。 tag代表标志类似编程语言的变量名,所以在proto 里面是唯一,wire_type 写的类型。这样子就很容易对应到我们编程中的变量定义。
这个Key 不一定是一个字节,因为tag 是varint ,动态整数。这个好处方便解析进制数据,方便扩展,不用担心,插入字段导致二进制顺序,如果对一些不需要字段可以不传,这样子网络传输内存就会减少。但坏处也是扩张带来数据增加,因为key不是必须的,比喻我们网络协议所有字段都是必须,而且不会在中间插入别的字段,那么key是没有必要的,如果一个包有10字段,相当于一个包起码增加10个字节,那么我一天发送很多数据包,那么浪费一些流量。但一个很多人产品,协议是不断升级的,所以前面说的也只是绝对条件下。相对于业务开发带来的好处,这点浪费算不了什么。想想http 这种短连接,浪费多少字节,但也不照样很流行。凡事不能太极端,否则收益就很低了。
原理我只简单写一下key 的东西,本来还想写varint ,但感觉查一下资料也比较理解。varint主要用来表示整数,主要为了省字节占用而已。tag 也是用varint表示,varint 涉及都大小端,然后还有进制操作,所以新手很难理解,我最开始不知道怎么算的,多看几次就够了。
动态解析protobuf好处,可以不用写proto文件,简单解析对应数据,然后根据经验猜出具体类型。因为wire_type 里面只是大类型,里面还有几种类型,如果没有原始proto的文件,那么只能通过自己具体业务分析具体类型。
后续补充一下自己解析c语言代码,因为当前含一些垃圾测试代码,所以暂时不贴出来。
最近遇到难解决的问题,自己亲人生病了,忽然发现身体才是最重要的。
一切美好肯定不现实,但珍惜每一天还是可以做到