- 浏览: 141128 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
yanbin0830:
你好,请问有全部的视频,或者代码吗?
传智播客-----JBPM介绍 -
qqliuyuxi:
不错,对我很有用
php模板引擎smarty的变量操作符 -
pouyang:
prototype是不是 javascript中所说的原型链啊 ...
JavaScript:prototype属性使用说明
ExtJS 2.2定时任务
定时任务是指不需要通过手动调用,其执行函数或代码会在指定的时间自动运行。
在JavaScript中提供了setTimeout和setInterval。 clearInterval和clearTimeout两对函数进行定时任务的处理。
其中setTimeout只执行一次,而setInterval按时间间隔反复执行。
clearInterval和clearTimeout函数则是分别用来取消setTimeout和setInterval的设定的定时任务。
如果通过setTimeout的定时任务还没有启动执行,那么只要传入该定时任务的引用到clearTimeout中就可以取消该任务。 clearInterval也一样,用来取消setInterval设定的定时任务,它们都不能中断正在执行中的函数。
有状态定时任务管理
既然我们能通过来setInterval实现连续间隔地执行指定任务(即函数)。但是任务执行时有先后的关联,即状态性。比如需要根据上一次的执行看看其结果是否满足,如果满足就不去继续执行,而中断该任务。
而setInterval做不到,它到了一定的间隔时间就会执行,它不会去关注上一次执行是否结束,它是另外开启新的线程并发执行。那么如何去实现任务的状态管理呢。有二种方法,一是采用setTimeout模拟,二是采用setInterval实现。
Ext.util.DelayedTask
Ext.util.DelayedTask 类从名字上就可以看出它是推迟任务管理。它用来实现隔指定时间长度之后执行任务,与PeriodicalExecuter不同,它不是针对于同个任务,而可能是多个任务,上一次任务如果还没有执行,它不是等待,而是取消转而执行当前任务。
比较典型的应用是ExtJS的事件配置中的buffer配置项,它用来指定延迟一段时间执行事件监听函数,如果在这个延迟时间之内,又有另外触发要执行其监听函数,上一次没有执行的任务取消,而又延迟buffer提定的时间去执行新任务。
在Ext.util.Event中有两个这样的函数用来处理buffer和delay配置参数:
var createBuffered = function(h, o, scope){
var task = new Ext.util.DelayedTask();
return function()...{
task.delay(o.buffer,h,scope,
Array.prototype.slice.call(arguments, 0));};
};
var createDelayed = function(h, o, scope)...{
return function()...{
var args = Array.prototype.slice.call(arguments, 0);
setTimeout(function()...{h.apply(scope, args);}, o.delay || 10);};
};
它们肯定是有区别的,createDelayed是用来进行延迟指定时间后去执行任务。它采用setTimeout完成,这个对于每个任务都是一定会执行的。而createBuffered不一同,对于同一个事件监听,它定义了一个任务DelayedTask,如果在其buffer时间里多次触发,那么它只执行最后一次触发的任务。
我们来看一下DelayedTask的delay函数:
this.delay = function(delay, newFn, newScope, newArgs){
if(id && delay != d)...{ this.cancel(); } ①
d = delay;
t = new Date().getTime();
fn = newFn || fn;
scope = newScope || scope;
args = newArgs || args; ②
if(!id)...{ id = setInterval(call, d);} }; ③
当构建一个DelayedTask实例,我们就可以多次来调用其delay方法来延迟其任务的执行。上面的函数有四个参数,其中命名有new前缀的都是可以省略采用实例中的任务(即通过构建函数参数传入。在①处,它用来判断该实例是否已经有任务正在执行,如果正在执行的任务的时间间隔和当前参数中指定的时间间隔不一样,就通过cancel取消正在执行中任务,取消就是通过 clearInterval来取消,并把id设为null。
在①②之间的代码就是把参数中值扩大到整个实例范围让其实例所有函数都能访问。③处是每隔指定的时间来执行当前实例的call函数。这个call函数当然是包裹函数,用来包裹定位任务,即参数中的回调函数。这也就是为什么要把参数中传入值扩大范围。
var call = function(){
var now = new Date().getTime();
if(now - t >= d)...{
clearInterval(id);
id = null;
fn.apply(scope, args || []); }
};
在call函数中,它在执行任务之前就会取消下一次定时任务,并把id设为null。可以看出该定位尽管是通过setInterval,它至多只运行一次。这里可以看作是采用setInterval模拟setTimeout。
①②③④⑤⑥⑦⑧⑨⑩
3.9.2定时任务管理器
上面的定时任务都是单个任务,如果需要对一组定时任务进行操作怎么办?ExtJS提供了Ext.TaskMgr 实例用来进行默认组的定时任务管理。它是通过Ext.util.TaskRunner类完成。
Ext.util.TaskRunner = function(interval){
interval = interval || 10;
var tasks = [], removeQueue = [];
var id = 0, running = false;
var stopThread = function()...{.. .. ..};
var startThread = function()...{.. .. ..};
var removeTask = function(t)...{.. .. .. };
var runTasks = function()...{ .. .. .. };
this.start = function(task)...{.. .. .. };
this.stop = function(task)...{.. .. .. };
this.stopAll = function()...{.. .. ..};
TaskRunner主要的作用是对一组定时任务进行统一地运行管理,我们可以通过其 start、stop函数来运行或停止指定的任务。另外还可以通过stopAll来停止所有正在运行的任务。其实TaskRunner和第九章中的动画实例管理器很相似。
如果我们需要启动一个定时任务,我们要通过其start函数,它有task参数是一个配置对象,用来指定执行的相关配置,其中run是要执行的任务函数,interval是指定它隔多长时间执行一次,但是不能小于整个管理器设定的interval,其默认是10ms。duration是用来指定任务的执行总的时间,如果没有指定时间,也可以通过指定repeat来指定次数。scope是run函数的作用域,args是run函数的参数。我们看一下 start: this.start = function(task){
tasks.push(task);
task.taskStartTime = new Date().getTime();
task.taskRunTime = 0;
task.taskRunCount = 0;
startThread();
return task; };
这里只要把task存到任务集合中去,再初始化一些值,之后通过startThread来启动一个新的线程执行任务。而它是通过setInterval(runTasks, interval);来执行runTasks函数,如果经运行了,就不会再次启动setInterval。
var runTasks = function(){
if(removeQueue.length > 0)...{ ①
for(var i = 0, len = removeQueue.length; i < len; i++)...{
tasks.remove(removeQueue[i]); }
removeQueue = [];
if(tasks.length < 1)...{ stopThread();return; }}
var now = new Date().getTime();
for(var i = 0, len = tasks.length; i < len; ++i)...{ ②
var t = tasks[i];
var itime = now - t.taskRunTime;
if(t.interval <= itime)...{ ③
var rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]);
t.taskRunTime = now;
if(rt===false||t.taskRunCount===t.repeat)...{removeTask(t);return;}
}
if(t.duration&&t.duration<=now-t.taskStartTime))...{removeTask(t);}④
}};
该函数分成两部分,①处是处理删除任务队列中的任务,②是处理运行任务队列中的任务。通过①处可以看出 removeTask并不是从tasks中除去,而把其引用加到removeQueue中,这样能避免影响正在运行中的任务。它的删除是在下一次运行中。
②处是对每个任务都进行执行,这个执行是根据其配置项的参数来进行的,③是根据时间或其重复次数来判断当前任务是否执行。如果超过指定的时间就运行 ④处代码,把它移到removeTask中去。
该类在Form中有应用。
定时任务是指不需要通过手动调用,其执行函数或代码会在指定的时间自动运行。
在JavaScript中提供了setTimeout和setInterval。 clearInterval和clearTimeout两对函数进行定时任务的处理。
其中setTimeout只执行一次,而setInterval按时间间隔反复执行。
clearInterval和clearTimeout函数则是分别用来取消setTimeout和setInterval的设定的定时任务。
如果通过setTimeout的定时任务还没有启动执行,那么只要传入该定时任务的引用到clearTimeout中就可以取消该任务。 clearInterval也一样,用来取消setInterval设定的定时任务,它们都不能中断正在执行中的函数。
有状态定时任务管理
既然我们能通过来setInterval实现连续间隔地执行指定任务(即函数)。但是任务执行时有先后的关联,即状态性。比如需要根据上一次的执行看看其结果是否满足,如果满足就不去继续执行,而中断该任务。
而setInterval做不到,它到了一定的间隔时间就会执行,它不会去关注上一次执行是否结束,它是另外开启新的线程并发执行。那么如何去实现任务的状态管理呢。有二种方法,一是采用setTimeout模拟,二是采用setInterval实现。
Ext.util.DelayedTask
Ext.util.DelayedTask 类从名字上就可以看出它是推迟任务管理。它用来实现隔指定时间长度之后执行任务,与PeriodicalExecuter不同,它不是针对于同个任务,而可能是多个任务,上一次任务如果还没有执行,它不是等待,而是取消转而执行当前任务。
比较典型的应用是ExtJS的事件配置中的buffer配置项,它用来指定延迟一段时间执行事件监听函数,如果在这个延迟时间之内,又有另外触发要执行其监听函数,上一次没有执行的任务取消,而又延迟buffer提定的时间去执行新任务。
在Ext.util.Event中有两个这样的函数用来处理buffer和delay配置参数:
var createBuffered = function(h, o, scope){
var task = new Ext.util.DelayedTask();
return function()...{
task.delay(o.buffer,h,scope,
Array.prototype.slice.call(arguments, 0));};
};
var createDelayed = function(h, o, scope)...{
return function()...{
var args = Array.prototype.slice.call(arguments, 0);
setTimeout(function()...{h.apply(scope, args);}, o.delay || 10);};
};
它们肯定是有区别的,createDelayed是用来进行延迟指定时间后去执行任务。它采用setTimeout完成,这个对于每个任务都是一定会执行的。而createBuffered不一同,对于同一个事件监听,它定义了一个任务DelayedTask,如果在其buffer时间里多次触发,那么它只执行最后一次触发的任务。
我们来看一下DelayedTask的delay函数:
this.delay = function(delay, newFn, newScope, newArgs){
if(id && delay != d)...{ this.cancel(); } ①
d = delay;
t = new Date().getTime();
fn = newFn || fn;
scope = newScope || scope;
args = newArgs || args; ②
if(!id)...{ id = setInterval(call, d);} }; ③
当构建一个DelayedTask实例,我们就可以多次来调用其delay方法来延迟其任务的执行。上面的函数有四个参数,其中命名有new前缀的都是可以省略采用实例中的任务(即通过构建函数参数传入。在①处,它用来判断该实例是否已经有任务正在执行,如果正在执行的任务的时间间隔和当前参数中指定的时间间隔不一样,就通过cancel取消正在执行中任务,取消就是通过 clearInterval来取消,并把id设为null。
在①②之间的代码就是把参数中值扩大到整个实例范围让其实例所有函数都能访问。③处是每隔指定的时间来执行当前实例的call函数。这个call函数当然是包裹函数,用来包裹定位任务,即参数中的回调函数。这也就是为什么要把参数中传入值扩大范围。
var call = function(){
var now = new Date().getTime();
if(now - t >= d)...{
clearInterval(id);
id = null;
fn.apply(scope, args || []); }
};
在call函数中,它在执行任务之前就会取消下一次定时任务,并把id设为null。可以看出该定位尽管是通过setInterval,它至多只运行一次。这里可以看作是采用setInterval模拟setTimeout。
①②③④⑤⑥⑦⑧⑨⑩
3.9.2定时任务管理器
上面的定时任务都是单个任务,如果需要对一组定时任务进行操作怎么办?ExtJS提供了Ext.TaskMgr 实例用来进行默认组的定时任务管理。它是通过Ext.util.TaskRunner类完成。
Ext.util.TaskRunner = function(interval){
interval = interval || 10;
var tasks = [], removeQueue = [];
var id = 0, running = false;
var stopThread = function()...{.. .. ..};
var startThread = function()...{.. .. ..};
var removeTask = function(t)...{.. .. .. };
var runTasks = function()...{ .. .. .. };
this.start = function(task)...{.. .. .. };
this.stop = function(task)...{.. .. .. };
this.stopAll = function()...{.. .. ..};
TaskRunner主要的作用是对一组定时任务进行统一地运行管理,我们可以通过其 start、stop函数来运行或停止指定的任务。另外还可以通过stopAll来停止所有正在运行的任务。其实TaskRunner和第九章中的动画实例管理器很相似。
如果我们需要启动一个定时任务,我们要通过其start函数,它有task参数是一个配置对象,用来指定执行的相关配置,其中run是要执行的任务函数,interval是指定它隔多长时间执行一次,但是不能小于整个管理器设定的interval,其默认是10ms。duration是用来指定任务的执行总的时间,如果没有指定时间,也可以通过指定repeat来指定次数。scope是run函数的作用域,args是run函数的参数。我们看一下 start: this.start = function(task){
tasks.push(task);
task.taskStartTime = new Date().getTime();
task.taskRunTime = 0;
task.taskRunCount = 0;
startThread();
return task; };
这里只要把task存到任务集合中去,再初始化一些值,之后通过startThread来启动一个新的线程执行任务。而它是通过setInterval(runTasks, interval);来执行runTasks函数,如果经运行了,就不会再次启动setInterval。
var runTasks = function(){
if(removeQueue.length > 0)...{ ①
for(var i = 0, len = removeQueue.length; i < len; i++)...{
tasks.remove(removeQueue[i]); }
removeQueue = [];
if(tasks.length < 1)...{ stopThread();return; }}
var now = new Date().getTime();
for(var i = 0, len = tasks.length; i < len; ++i)...{ ②
var t = tasks[i];
var itime = now - t.taskRunTime;
if(t.interval <= itime)...{ ③
var rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]);
t.taskRunTime = now;
if(rt===false||t.taskRunCount===t.repeat)...{removeTask(t);return;}
}
if(t.duration&&t.duration<=now-t.taskStartTime))...{removeTask(t);}④
}};
该函数分成两部分,①处是处理删除任务队列中的任务,②是处理运行任务队列中的任务。通过①处可以看出 removeTask并不是从tasks中除去,而把其引用加到removeQueue中,这样能避免影响正在运行中的任务。它的删除是在下一次运行中。
②处是对每个任务都进行执行,这个执行是根据其配置项的参数来进行的,③是根据时间或其重复次数来判断当前任务是否执行。如果超过指定的时间就运行 ④处代码,把它移到removeTask中去。
该类在Form中有应用。
发表评论
-
视频html代码
2010-04-21 20:26 1038视频html代码 播放视频最实用的一段代码是: 程序代码&l ... -
<object>标签属性和用法
2010-04-21 15:08 2505快播的classid="clsid:F3D0D36F ... -
extjs record
2010-04-11 22:04 3900Ext.data.Store是EXT中用来 ... -
extjs获取 JSON数据的字段
2010-04-11 17:14 2229//获取json字符串中的一个值 我只会ExtJS中的方法: ... -
Ext的FormPanel刷新
2010-04-11 15:27 2176动态增加的代码如下: 在Form上面加入一个按钮: ... -
panel_load_刷新
2010-04-10 22:39 1762引用页刷新的问题不仅仅体现在TabPanel里,只要是带loa ... -
datasource 类
2010-04-07 21:55 917package org.leno.javabean; ... -
ext表单验证
2010-04-06 17:23 21092009-06-19 09:55 by 三把刷子, 604 v ... -
java多线程编程实例
2010-04-04 20:36 7526java多线程编程实例Java学练 2009-07-23 16 ... -
jsp 用urlrewrite 实现URL 重写
2010-04-03 11:52 858jsp 用urlrewrite 实现URL 重写 是否 ... -
Socket多线程最好的资料
2010-04-02 17:15 3006Java多线程Socket资料 ---- 摘要:在Jav ... -
java串口编程
2010-04-02 12:53 17931. SerialBean SerialBean是本类库与其他 ... -
JAVA 与 QQ 网络通讯实例
2010-04-02 12:50 1019JAVA 与 QQ 网络通讯实例 准备工作:1.两个QQ(Q ... -
extjs tree tabplanel
2010-04-01 18:14 2143在实际的项目中,左边树形菜单,提供各种功能点击,右边一个面板 ... -
学习ExtJS Window常用方法
2010-03-27 15:52 1276ExtJS Window常用方法,需要的朋友可以参考下。一、属 ... -
extjs form
2010-03-27 15:31 1174Ext Panel:设置Frame属性为true 收藏 对Ex ... -
extjs tree accortion
2010-03-25 19:18 922<html> <head> ... -
ExtJS事件
2010-03-25 18:07 1585ExtJS入门之事件(fireEvent) 关键字: java ... -
extjs
2010-03-24 19:51 653ext编辑表格 只需要在cm 加上 editor ... -
javascript的疑问????????????
2010-03-23 20:18 665<%@ page language="java ...
相关推荐
java项目之ExtJS 2.2 开源网络硬盘系统(jsp上传下载)java项目之ExtJS 2.2 开源网络硬盘系统(jsp上传下载)java项目之ExtJS 2.2 开源网络硬盘系统(jsp上传下载)java项目之ExtJS 2.2 开源网络硬盘系统(jsp上传...
(基于JSP的完整java毕业设计)ExtJS 2.2 图书管理系统(基于JSP的完整java毕业设计)ExtJS 2.2 图书管理系统(基于JSP的完整java毕业设计)ExtJS 2.2 图书管理系统(基于JSP的完整java毕业设计)ExtJS 2.2 图书管理...
ExtJS 2.2 API 文档,CHM格式。
(基于JSP的完整java毕业设计)ExtJS 2.2 开源网络硬盘系统(附源码)(基于JSP的完整java毕业设计)ExtJS 2.2 开源网络硬盘系统(附源码)(基于JSP的完整java毕业设计)ExtJS 2.2 开源网络硬盘系统(附源码)...
[上传下载]ExtJS 2.2 开源网络硬盘系统_dogdisk.zip
以前一直没找到extjs2.2的全包,这次在添加Myeclipse的插件时,我找了好久才找到。现在分享下,以免兄弟姐妹们到处去找:
EXTJS 2.2 离线帮助文件CHM格式 欢迎大家使用!! 从EXTJS官方网站上下载下来后做成的CHM,以前2.0版也是我做的! 没有问题!!
Extjs 2.2 中文开发文档 , 很少有错误。 我现在做开发,用的就是2.2版本的。
ExtJS 2.2 开源网络硬盘系统_dogdisk.zip
extjs 2.2的压缩包
ExtJs的中文文档 搭配ExtJs2.2实例更快将ExtJs入手 代码均有详细说明 分类清晰
里面包含Extjs 2.2和Extjs 3.2.1版本两个文件
自己写的ExtJs简明教程,第一节是入门,包括如下内容: ExtJs包的内容和简介 Spket插件的安装 API的使用和安装(针对不停loading的问题) 还有入门实例和它的代码
java项目之ExtJS 2.2 图书管理系统源码java项目之ExtJS 2.2 图书管理系统源码java项目之ExtJS 2.2 图书管理系统源码java项目之ExtJS 2.2 图书管理系统源码java项目之ExtJS 2.2 图书管理系统源码java项目之ExtJS 2.2 ...
Oozie web console is disabled 时需要安装的ExtJS 2.2,亲测有效
extjs 2.2(oozie需要的) ,将压缩包解压后,提取ext-2.2.zip包上传到/opt/cloudera/parcels/CDH/lib/oozie/libext,用unzip解压即可。
extjs 是一种web 的页面设计。只要写代码也能做出漂亮美观的页面。
使用struts2(json-plugin) + spring2 + ibatis2 + extjs2.2 + mysql5.0架构开发的图书管理系统,对学习struts2,json-plugin,spring2,ibatis2, extjs2.2及其整合开发有很大帮助。 原作地址:...
ExtJS 2.2,图书管理系统 ExtJS 2.2,图书管理系统
extjs2.2 oozie可以使用的 oozie需要使用extjs2.2