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中的Window窗口对象
Jan 16 Javascript
比Jquery的document.ready更快的方法
Apr 28 Javascript
动态的绑定事件addEventListener方法的使用
Jan 24 Javascript
tuzhu_req.js 实现仿百度图片首页效果
Aug 11 Javascript
第九篇Bootstrap导航菜单创建步骤详解
Jun 21 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
Sep 21 Javascript
Vue2.0使用过程常见的一些问题总结学习
Apr 10 Javascript
vue实现简单表格组件实例详解
Apr 16 Javascript
jQuery实现的回车触发按钮事件功能示例
Mar 25 jQuery
通过vue提供的keep-alive减少对服务器的请求次数
Apr 01 Javascript
微信小程序仿美团城市选择
Jun 06 Javascript
微信小程序mpvue点击按钮获取button值的方法
May 29 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
星际实力自我测试
2020/03/04 星际争霸
php 深入理解strtotime函数的使用详解
2013/05/23 PHP
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
php中array_unshift()修改数组key注意事项分析
2016/05/16 PHP
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
javascript面向对象快速入门实例
2015/01/13 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
对javascript继承的理解
2016/10/11 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
关于Stream和Buffer的相互转换详解
2017/07/26 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
jQuery实现的点击按钮改变样式功能示例
2018/07/21 jQuery
2019最新21个MySQL高频面试题介绍
2020/02/06 Javascript
调试Python程序代码的几种方法总结
2015/04/28 Python
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
2017/05/24 Python
python实现稀疏矩阵示例代码
2017/06/09 Python
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
java字符串格式化输出实例讲解
2021/01/06 Python
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
linux面试题参考答案(10)
2013/11/04 面试题
学生个人的自我评价分享
2013/11/05 职场文书
司机的工作范围及职责
2013/11/13 职场文书
求职信范文怎么写
2014/01/29 职场文书
民族学专业职业生涯规划范文:积跬步以至千里
2014/09/11 职场文书
500字小学生检讨书
2015/02/19 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
浅谈Python数学建模之整数规划
2021/06/23 Python
搭建Yolov5服务器
2022/04/30 Servers
Golang实现可重入锁的示例代码
2022/05/25 Golang