当前位置: 首页 > news >正文

2008 iis 添加 网站 权限设置网站策划案4500

2008 iis 添加 网站 权限设置,网站策划案4500,随机网站生成器,企业培训公司我的一个c项目,有个类,运行过程中会创建多个实例,每个实例独自一个线程。原本程序设置了一个静态、全局的计数器,实际上是所有实例共用,但我希望每个实例管理自己的计数器。最自然的想法,应该设置一个私有变…

我的一个c++项目,有个类,运行过程中会创建多个实例,每个实例独自一个线程。原本程序设置了一个静态、全局的计数器,实际上是所有实例共用,但我希望每个实例管理自己的计数器。最自然的想法,应该设置一个私有变量作为计数器,每个实例操作这个私有变量。但是,程序中有回调函数,不好传递这些个变量。

解决的办法还是设置静态、全局的计数器,但改为集合,每个实例对应一个集合元素。具体代码如下:

定义一个全局的集合,集合元素是一个结构。集合的key,是实例中一个关键的ID值,是唯一的。在实例的构造函数中,即往该集合中添加一个元素。进行计数的目的,不仅仅是为了观察程序运行情况,更重要的是,用于判断是否与设备失联。

一、代码介绍

1、定义

struct ReceiveCount { // 接收计数器long sent_count = 0;//发送计数器long received_count = 0;//接收计数器long last_received_count = 0;//最上一次接收量void reset() {//重置计数器sent_count = 0;received_count = 0;last_received_count = 0;}void send() { sent_count++; }//发送计数void receive() { received_count++; }//接收计数float getLossRate() {//计算接收/发送比率if (sent_count == 0)return 0.0f;return ((float)(sent_count - received_count) / sent_count) * 100.0f;}long getNewReceived() {//最新接收量long new_cnt = received_count - last_received_count;last_received_count = received_count;return new_cnt > 0 ? new_cnt : 0;}long getReceived() { return received_count; }long getSend() { return sent_count; }
};std::map<int, ReceiveCount> g_recivCountMap; // key的类型是int

2、构造

类的构造函数调用此方法

void initRecivCount(int master_id) {reciv_count_mtx.lock();auto it = g_recivCountMap.find(master_id);if (it == g_recivCountMap.end()) {// 不存在:插入新元素(自动调用 ReciveCount 的默认构造)g_recivCountMap.emplace(master_id, ReceiveCount{});} else {// 存在:重置计数器it->second.reset();}reciv_count_mtx.unlock();
}

3、计数

1)向设备发送指令时进行发送计数

  auto it = g_recivCountMap.find(this->master_id);if (it != g_recivCountMap.end()) {it->second.send();}

2)在设备信息回调函数中进行接收计数

    auto it2 = g_recivCountMap.find(master_id);if (it2 != g_recivCountMap.end()) {it2->second.receive();}

4、统计

定期进行统计

auto it = g_recivCountMap.find(this_->master_id);
if (it != g_recivCountMap.end()) {ReceiveCount &counter = it->second;long newRecvNum = counter.getNewReceived();printf("%s : loss data rate: %.2f%%,recive num:(%ld)\n", this_->siimip, counter.getLossRate(), newRecvNum);if (newRecvNum == 0) {no_new++;if (no_new > 10) { // 连续10次没有收到回调消息,即认为已经断连no_new = 0;//此次进行重连。。。}} else {no_new = 0;}
}

二、注意的问题

开发过程中,有一个问题很让我疑惑。就是为什么最新接收量永远等于累计接收量。明明该方法里面有运算

  long getNewReceived() {//最新接收量long new_cnt = received_count - last_received_count;last_received_count = received_count;return new_cnt > 0 ? new_cnt : 0;}

后来AI告诉我,主要是我的调用方法有问题:

ReceiveCount counter = it->second;
long newRecvNum = counter.getNewReceived();

原因是ReceiveCount counter = it->second; 相当于把 g_recivCountMap 中的 ReceiveCount 对象拷贝了一份,在 counter.getNewReceived() 中修改的是 拷贝体的 last_received_count,而 原始 map 中的对象没有更新!(这就跟c#和java的不一样。c#和java的话,couter就应该算是引用类型,修改的都是同一份。)

应该是

ReceiveCount &counter = it->second;
long newRecvNum = counter.getNewReceived();

好奇戒啊。

http://www.dtcms.com/a/537053.html

相关文章:

  • 以自主创新推动能源装备智能化升级,为能源安全构筑“确定性”底座
  • 构建AI智能体:七十六、深入浅出LoRA:低成本高效微调大模型的原理与实践
  • 中国各大网站排名网站源码爬取
  • FFmpeg 安装与配置教程(Windows 系统)
  • 【数字逻辑】 60进制数字秒表设计实战:用74HC161搭计数器+共阴极数码管显示(附完整接线图)
  • 新网网站空间花都网站建设价格
  • 前端底层原理与复杂问题映射表
  • Digital Micrograph下载安装教程
  • 怎么做网站的301建设设计院网站
  • 自己的服务器 linux centos8部署django项目
  • 做网站注册会员加入实名认证功能广西建设工程质量监督网站
  • 遵义哪里有做网站的外国网站上做Task
  • 动态修改浏览器地址而不刷新页面
  • 车牌识别相机:中哈口岸的通关智能助力
  • 音视频开发远端未发布视频占位图2
  • 【普中STM32F1xx开发攻略--标准库版】-- 第 9 章 STM32 固件库介绍
  • OpenCV 视频处理
  • 有些网站做不了seo物业公司会计好做吗
  • 实惠的制作网站网站首页的功能需求分析
  • ROS2 轨迹规划核心点
  • [GESP202506 五级] 奖品兑换
  • Strassen矩阵乘法算法
  • 网站开发新闻怎么写相应式手机网站建设
  • [C++][windows]C++类成员函数默认参数和成员变量初始化问题
  • Vue 动态路由复制标签页失效?彻底解决新标签页路由空白问题
  • 扁平化网站特效张家港网站建设培训班
  • 【GaussDB】深入剖析Insert Select慢的定位全过程
  • 面向智能体与大语言模型的 AI 基础设施:选项、工具与优化
  • 招商网站建设服务商湖南专业网站建设服务
  • 从0到1:易趋驱动产品研发项目全流程管理效能跃升