silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)


Posted in Javascript onAugust 09, 2011

案例背景:

整个功能其实就是从数据库取出数据,然后在界面上播放,简单地说就是类似网上在线看视频,听音乐,只不过我取的是字符串数据,而他们取的是流文件数据。把整体数据分成十份,十个线程同时向数据库取数据(并发提高速度)放在十个队列中,另外一个线程从队列中取数据拿出来到界面上播放,可以拖动播放进度,停止,暂停,重新播放,控制播放速度。恩,功能听起来似乎很简单,做起来也不是很难。但是后面发现的一些问题,以及顺着这些问题往下挖掘,挖掘了一些我认为值得记住的东西。
关键东西:

1. siliverlight 后台线程 BackgroundWorker m_GetReplayData= new BackgroundWorker();
2. 跨线程访问界面控件 ,this.Dispatcher.BeginInvoke( /访问界面UI);
3. javascript 式的函数指针: var ShowSIngleLog = function(){} ;(在父页面上)
4 .子页面注册父页面的事件: var fatharWindow = window.opener; ;
fatharWindow .ShowSIngleLog =function(){//播放数据 showTrace()};
5.javascript引擎线程,界面渲染线程,浏览器事件触发线程;
6.浏览器引擎是单线程,也就是所有东西都是同步的,不存在两个线程同时跑
问题所在:
通过silverlight线程的循环来调用JS方法达到播放界面数据的效果,因为silverlight只能调用本页面的JS方法,可是轨迹回放的页面是主页面弹出的一个子页面,于是我利用主页面的一个空的函数指针,子页面注册父页面的事件来达到Silverlight调用子页面方法目(上面提到的第3点)。经过我仔细的推敲和论证我确定没问题,做完后的也没什么问题。本地测试的都是用上百条,上千条数据,问题不大,停止,暂停,拖动进度,问题都不大,就是父页面界面有点卡,一开始我并没有重视这个问题。到了测试那边是2万多条数据播放,播放5分钟后主界面卡死了,轨迹回放页面上的,停止,拖动进度,暂停,播放按钮全部失效了。现象非常地诡异,我一度认为是测试的机器问题,最后发现是大数据量的问题。this.Dispatcher.BeginInvoke( /访问界面UI)这个调用看似很简单,很普通,但是有两

  个特点:
1.它是异步的,也就是调一下不一定马上执行,先调不一定先执行,需要做同步控制;
2.这个方法要抢占浏览器界面渲染线程,而该线程与javascript引擎线程是互斥的.

  2万多数据,一开始我控制了播放速度,所以刚开始没什么问题,到后面很多数据都卡在这个方法上,导致不断地抢占浏览器界面渲染线程,导致主页面非常卡,直到卡死为止。点击主页面,浏览器事件触发线程要运行,但是这个时候界面渲染线程在跑,所以非常卡。
解决方案:

  this.Dispatcher.BeginInvoke( /访问界面UI),很明是这个东西造成,那就找替代方法。原来数据队列是放在silverlight上,我改成放在javascript 队列上。播放数据不依赖银光线程,利用setimeout (该方法在IE6下会内存泄露,所以一开始被我排斥)来定时播放数据。结果很漂亮,页面很顺畅,没有了异步的问题,不用去控制让数据同步播放,也比较简单。
分析原因:
为什么用silerlight来播放会很卡,但是setimeout来播不会卡,两个都是连续播放的,而且setimeout在播放的时候,点击页面,页面也能响应事件,这个问题我们要从事件驱动javascript引擎。页面卡的原因上面已经说了,主要是想解释一下setimeout播放为什么不卡。浏览器中的JavaScript引擎是基于事件驱动的,这里的事件可看作是浏览器派给它的各种任务,这些任务可以源自 JavaScript引擎当前执行的代码块,如调用setTimeout添加一个任务,也可来自浏览器内核的其它线程,如界面元素鼠标点击事件,定时触发器时间到达通知,异步请求状态变更通知等.从代码角度看来任务实体就是各种回调函数,JavaScript引擎一直等待着任务队列中任务的到来.由于单线程关系,这些任务得进行排队,一个接着一个被引擎处理。所以在播放数据的时候,操作界面的是会被加到任务队列中,会得到执行,自然用户角度感受到整个页面也不卡了。

Javascript 相关文章推荐
Javascript中克隆一个数组的实现代码
Dec 06 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
Mar 05 Javascript
使用纯javascript实现经典扫雷游戏
Apr 23 Javascript
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
Dec 10 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
Apr 19 Javascript
JScript实现表格的简单操作
Aug 15 Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
Sep 29 Javascript
浅析JavaScript中的特殊数据类型
Dec 15 Javascript
Django+Vue实现WebSocket连接的示例代码
May 28 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
Nov 07 Javascript
基于js实现数组相邻元素上移下移
May 19 Javascript
微信小程序input抖动问题的修复方法
Mar 03 Javascript
javascript 主动派发事件总结
Aug 09 #Javascript
JsDom 编程小结
Aug 09 #Javascript
IE 当eval遇上function的处理
Aug 09 #Javascript
取得窗口大小 兼容所有浏览器的js代码
Aug 09 #Javascript
Javascript实现的类似Google的Div拖动效果代码
Aug 09 #Javascript
基于Jquery的文字自动截取(提供源代码)
Aug 09 #Javascript
JQuery动态创建DOM、表单元素的实现代码
Aug 09 #Javascript
You might like
PHP正则的Unknown Modifier错误解决方法
2010/03/02 PHP
PHP数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
php的curl封装类用法实例
2014/11/07 PHP
PHP的垃圾回收机制代码实例讲解
2021/02/27 PHP
html+js实现动态显示本地时间
2013/09/21 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
使用js完成节点的增删改复制等的操作
2014/01/02 Javascript
JS中怎样判断undefined(比较不错的方法)
2014/03/27 Javascript
sails框架的学习指南
2014/12/22 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
JS时间控制实现动态效果的实例讲解
2017/07/31 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
elementUi vue el-radio 监听选中变化的实例代码
2019/06/28 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
python time模块用法实例详解
2014/09/11 Python
python中执行shell命令的几个方法小结
2014/09/18 Python
Python实现向QQ群成员自动发邮件的方法
2014/11/19 Python
python通过opencv实现批量剪切图片
2017/11/13 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
python实现按首字母分类查找功能
2019/10/31 Python
python 并发下载器实现方法示例
2019/11/22 Python
解决tensorflow训练时内存持续增加并占满的问题
2020/01/19 Python
Python requests模块cookie实例解析
2020/04/14 Python
python中pickle模块浅析
2020/12/29 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
乌克兰香水和化妆品网站:Notino.ua
2018/03/26 全球购物
暑期实习鉴定
2013/12/16 职场文书
学术会议邀请函范文
2014/01/22 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
某某幼儿园的教育教学管理调研分析报告
2019/11/29 职场文书
Python基础之元组与文件知识总结
2021/05/19 Python
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python
如何通过cmd 连接阿里云服务器
2022/04/18 Servers