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 相关文章推荐
jQuery基础知识filter()和find()实例说明
Jul 06 Javascript
为EasyUI的Tab标签添加右键菜单的方法
Jul 14 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
Jan 21 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
Nov 22 Javascript
js实现简单的购物车有图有代码
May 26 Javascript
BootStrap使用file-input插件上传图片的方法
Sep 05 Javascript
js实现不提示直接关闭网页窗口
Mar 30 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
Aug 13 Javascript
vue实现日历备忘录功能
Sep 24 Javascript
vue实现行列转换的一种方法
Aug 06 Javascript
vue(2.x,3.0)配置跨域代理
Nov 27 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
Feb 14 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下使用无限生命期Session的方法
2007/03/16 PHP
浅析php原型模式
2014/11/25 PHP
php获取错误信息的方法
2015/07/17 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
LazyLoad 延迟加载(按需加载)
2010/05/31 Javascript
js location.replace与location.reload的区别
2010/09/08 Javascript
Javascript学习笔记二 之 变量
2010/12/15 Javascript
关于textarea提交的内容无法换行的解决办法
2013/04/09 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
jQuery制作网页版选项卡
2016/07/28 Javascript
jQuery实现的鼠标滚轮控制图片缩放功能实例
2017/10/14 jQuery
Node.js爬取豆瓣数据实例分析
2018/03/05 Javascript
vue+axios新手实践实现登陆的示例代码
2018/06/06 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
Python Mysql数据库操作 Perl操作Mysql数据库
2009/01/12 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
在python中安装basemap的教程
2018/09/20 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
Django框架模板介绍
2019/01/15 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
如何用python免费看美剧
2020/08/11 Python
五款漂亮的纯CSS3动画按钮的实例教程
2014/11/21 HTML / CSS
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
普通大学毕业生自荐信
2013/11/04 职场文书
会计职业生涯规划书
2014/01/13 职场文书
打架检讨书100字
2014/01/19 职场文书
《东方明珠》教学反思
2014/04/20 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
阳光体育运动标语口号
2015/12/26 职场文书
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python
Go gorilla/sessions库安装使用
2022/08/14 Golang