unity学习(88)——断线的原因--客户端队列死锁(头部异常为null)

客户端接受数据包的队列如下:

测试可以得到明显的溢出结果,肯定是有问题的!

 在catch中输出具体异常:Object reference not set to an instance of an object!

然后通过debug.log定位具体异常位置!这也不算浪费时间,但确实拖了大概有2周的时间。

问题出在3号位置和4号位置之间

也就是onMessage中有错!之前能继续执行说明是被try给救了

 错误的时间和位置都找到了,model没有解码出来!只要能解决问题,我咋都行!

测了一下,只要能进来,都是49次,相同的message的总和也是49次!

 

问题又回到了List[0]那里:

 继续测试,找list[0]里面到底存的什么!只要onMessage读不出来,RemoveAt也一直不会动的,自然就卡死了,队列死锁

这时需要学会一个新的调试方法!在catch中下断点!没错!这样可以既不影响程序正常运行,又可查看异常时的状态!尤其是堆栈

确实是出现list[0]=null,list[1]还是124包的情况了

 我尝试了寻找原因,发现并不现实,但是知道原因,解决起来很简单!

出现异常时,在catch中运行一次removeAt(0)即可

try
{Debug.Log("队列错误1");List<SocketModel> list = NetWorkScript.getInstance().getList();//这么写的目的是实现全局对象,关键是要做到不卡Debug.Log("队列错误2");                                                              //List<SocketModel> list = instance.getList();for (int i = 0; i < 8; i++)//每帧8条信息,i不参见内部算法,所以有错一定错在头顶null!{if (list.Count > 0){Debug.Log("队列有货!!!!!!!!!!!!!!");SocketModel model = list[0];//后面有取出信息的Debug.Log(model.type+" "+DateTime.Now);//Debug.Log(model.area + " " + DateTime.Now);Debug.Log(model.command + " " + DateTime.Now);Debug.Log(model.message + " " + DateTime.Now);Debug.Log("哪天见,哪天算完");Debug.Log("队列错误3");OnMessage(model);//处理当前的第一条信息Debug.Log("队列错误4");list.RemoveAt(0);//读了就删,很好的--收发不用一一对应!合理利用堆栈和删除栈顶即可!!!Debug.Log("队列错误5");//Debug.Log("成功移动数据包堆栈" + Time.time);}else{break;//无消息跳出循环}}
}
catch (Exception ex)
{//MyLog.form.textAdd(ex.Message);Debug.Log("队列有货!!!!!!!!!!!!!!异常");Debug.Log("出现异常时,在catch中运行一次removeAt(0)即可"+ex.Message+" "+DateTime.Now);///有错一定错在头顶nullList<SocketModel> list = NetWorkScript.getInstance().getList();list.RemoveAt(0);//list.RemoveAt(0);
}

实测结果可以有效防止异常:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【QT学习】9.绘图,三种贴图,贴图的转换,不规则贴图(透明泡泡)

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统&#xff0c;可以使用相同的 API 在屏幕和绘图设备上进行绘制&#xff0c;它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作&#xff0c;其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…

【Java | 多线程】可重入锁的概念以及示例

什么是可重入锁&#xff08;Reentrant Lock&#xff09;&#xff1f; 可重入锁&#xff08;又名递归锁&#xff09;是一种特殊类型的锁&#xff0c;它允许同一个线程在获取锁后再次进入该锁保护的代码块或方法&#xff0c;而不需要重新获取锁。 说白了&#xff0c;可重入锁的…

互联网和嵌入式,哪个更吃香?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;显然&#xff0c;互联网更受青…

地形系统-unity3D地形的生成原理和地形表面贴图的混刷原理

Unity3D地形的生成原理是通过使用高度图来创建地形。高度图是一个灰度图像&#xff0c;其中每个像素的灰度值表示该位置的高度。在Unity中&#xff0c;可以使用工具或编程方式创建高度图&#xff0c;然后将其应用于地形对象。 地形表面贴图的混刷原理是通过将多个纹理图层叠加…

No.1 - 职场关键角色通识宝典之课程内容先导

&#x1f4d6; 该文隶属 程序员&#xff1a;职场关键角色通识宝典 ✍️ 作者&#xff1a;哈哥撩编程&#xff08;视频号同名&#xff09; 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏…

Mysql全局优化总结

Mysql全局优化总结 从上图可以看出SQL及索引的优化效果是最好的&#xff0c;而且成本最低&#xff0c;所以工作中我们要在这块花更多时间 服务端系统参数 官方文档&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_max_connections…

MSE实现全链路灰度实践

技术架构包括以下基础设施和云服务&#xff1a; 1个地域&#xff1a;ACK集群、微服务应用、MSE实例均部署在同一地域下。 1个专有网络VPC&#xff1a;形成云上私有网络&#xff0c;确保核心云资源的网络环境&#xff0c;如容器服务ACK、微服务引擎MSE。 ACK集群&#xff1a;简单…

七星创客新零售系统:颠覆性商业模式的崛起

大家好&#xff0c;我是微三云周丽&#xff0c;今天给大家分析当下市场比较火爆的商业模式&#xff01; 小编今天跟大伙们分享什么是七星创客新零售系统&#xff1f; 随着经济的快速发展和科技的不断进步&#xff0c;商业模式的革新成为了企业发展的关键。在这个新旧动能转换、…

CentOS配置JDK8环境并安装配置neo4j

1. 工具安装 1. 安装wget yum install -y wget2. 安装vim yum install -y vim-enhanced2. 配置JDK 1. 安装JDK 先到官网下载jdk8的压缩包&#xff0c;点我传送&#xff0c;并将压缩包上传到虚拟机的/usr/local目录下。 cd /usr/local # 进入 /usr/local目录 tar -zxvf jdk-…

使用Perf诊断PostgreSQL性能问题

1 编译参数 使用perf获取完整的堆栈信息需要下面几个编译参数&#xff1a; -O0&#xff1a;编译器不做优化-ggdb3&#xff1a;增加了为GDB优化的调试信息&#xff0c;级别是3-g3&#xff1a;增加了调试信息&#xff0c;级别是3-fno-omit-frame-pointer&#xff1a;保留完成的…

「JavaEE」线程状态

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;JavaEE &#x1f387;欢迎点赞收藏加关注哦&#xff01; 线程状态 &#x1f349;start 和 run 的区别&#x1f349;终止线程&#x1f349;join & 阻塞状态&#x1f349;线程六大状态 &…

Java离线视频提取音频+音频提取文案

需引入依赖javacv、vosk相关依赖&#xff0c; 至于javacv依赖&#xff0c;网上有很多缩减方案&#xff0c;注释部分是可行的缩减方案&#xff0c;至于视频提取视频这里无需安装ffmpeg&#xff0c;只需引入依赖。而vosk需要下载模型方可使用&#xff0c;并且下载比较慢&#xf…

docker 基本命令

目录 一、docker 镜像操作命令 1.1.查询软件镜像 1.2.docker pull&#xff1a;下载镜像 1.3.docker push&#xff1a;上传镜像 1.4.docker images&#xff1a;查看本地镜像 1.5.docker inspect &#xff1a;获取镜像详细信息 1.6.docker tag&#xff1a;添加镜像标签 …

tornado模板注入

这是我在做一道ctf题目当中遇到的&#xff0c;不太会&#xff0c;所以浅浅学习了一下&#xff0c;跟大家分享。 1.介绍 tornado是python当中的一个模板&#xff0c;因此这个漏洞是归属于SSTI(服务器模板漏洞&#xff09;&#xff0c;所谓的模板其实就是一种框架&#xff0c;p…

L2-052 吉利矩阵

所有元素为非负整数&#xff0c;且各行各列的元素和都等于 7 的 33 方阵称为“吉利矩阵”&#xff0c;因为这样的矩阵一共有 666 种。 本题就请你统计一下&#xff0c;把 7 换成任何一个 [2,9] 区间内的正整数 L&#xff0c;把矩阵阶数换成任何一个 [2,4] 区间内的正整数 N&…

Git:使用conda命令切换虚拟环境

1. 问题 在win10电脑的Git中&#xff0c;无法使用conda list命令&#xff0c;报错&#xff08;bash&#xff1a;conda&#xff1a;command not found&#xff09;。也无法使用conda activate base命令激活虚拟环境&#xff0c;报错&#xff08;bash&#xff1a;conda&#xff…

pollLast() 和poll啥区别

在 Java 中&#xff0c;pollLast() 和 poll() 是 Deque 接口的两个不同的方法&#xff0c;它们都用于从双端队列中移除并返回元素&#xff0c;但它们移除元素的位置不同&#xff1a; poll(): poll() 方法从双端队列的前端移除并返回第一个元素&#xff08;即队列的头部&#xf…

共享单车数据分析与需求预测项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 项目背景 自动自行车共享系统是传统自行车租赁的新一代&#xff0c;整个会员、租赁和归还过程都变得自动化。通过这些系统&#xff0c;用户可以…

C# ToString

你可以创建自定义数字格式字符串&#xff0c;这种字符串由一个或多个自定义数字说明符组成&#xff0c;用于定义设置数值数据格式的方式。 自定义数字格式字符串是任何不属于 标准数字格式字符串的格式字符串。 自定义数字格式字符串

【c++】cpp类和对象

&#xff08;1&#xff09;类的封装 封装的多层含义 把属性和⽅法进⾏封装对属性和⽅法进⾏访问控制类的内部和类的外部类的访问控制关键字 public: 修饰的成员变量和函数&#xff0c;可以在类的内部和类的外部访问private: 修饰的成员变量和函数&#xff0c;只能在类的内部…