TaskMgr.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:5k
源码类别:

中间件编程

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.0.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. /**
  8.  * @class Ext.util.TaskRunner
  9.  * Provides the ability to execute one or more arbitrary tasks in a multithreaded
  10.  * manner.  Generally, you can use the singleton {@link Ext.TaskMgr} instead, but
  11.  * if needed, you can create separate instances of TaskRunner.  Any number of
  12.  * separate tasks can be started at any time and will run independently of each
  13.  * other. Example usage:
  14.  * <pre><code>
  15. // Start a simple clock task that updates a div once per second
  16. var updateClock = function(){
  17.     Ext.fly('clock').update(new Date().format('g:i:s A'));
  18. var task = {
  19.     run: updateClock,
  20.     interval: 1000 //1 second
  21. }
  22. var runner = new Ext.util.TaskRunner();
  23. runner.start(task);
  24. // equivalent using TaskMgr
  25. Ext.TaskMgr.start({
  26.     run: updateClock,
  27.     interval: 1000
  28. });
  29.  * </code></pre>
  30.  * Also see {@link Ext.util.DelayedTask}. 
  31.  * 
  32.  * @constructor
  33.  * @param {Number} interval (optional) The minimum precision in milliseconds supported by this TaskRunner instance
  34.  * (defaults to 10)
  35.  */
  36. Ext.util.TaskRunner = function(interval){
  37.     interval = interval || 10;
  38.     var tasks = [], 
  39.      removeQueue = [],
  40.      id = 0,
  41.      running = false,
  42.      // private
  43.      stopThread = function(){
  44.         running = false;
  45.         clearInterval(id);
  46.         id = 0;
  47.     },
  48.      // private
  49.      startThread = function(){
  50.         if(!running){
  51.             running = true;
  52.             id = setInterval(runTasks, interval);
  53.         }
  54.     },
  55.      // private
  56.      removeTask = function(t){
  57.         removeQueue.push(t);
  58.         if(t.onStop){
  59.             t.onStop.apply(t.scope || t);
  60.         }
  61.     },
  62.     
  63.      // private
  64.      runTasks = function(){
  65.      var rqLen = removeQueue.length,
  66.      now = new Date().getTime();          
  67.     
  68.         if(rqLen > 0){
  69.             for(var i = 0; i < rqLen; i++){
  70.                 tasks.remove(removeQueue[i]);
  71.             }
  72.             removeQueue = [];
  73.             if(tasks.length < 1){
  74.                 stopThread();
  75.                 return;
  76.             }
  77.         }         
  78.         for(var i = 0, t, itime, rt, len = tasks.length; i < len; ++i){
  79.             t = tasks[i];
  80.             itime = now - t.taskRunTime;
  81.             if(t.interval <= itime){
  82.                 rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]);
  83.                 t.taskRunTime = now;
  84.                 if(rt === false || t.taskRunCount === t.repeat){
  85.                     removeTask(t);
  86.                     return;
  87.                 }
  88.             }
  89.             if(t.duration && t.duration <= (now - t.taskStartTime)){
  90.                 removeTask(t);
  91.             }
  92.         }
  93.     };
  94.     /**
  95.      * Starts a new task.
  96.      * @method start
  97.      * @param {Object} task A config object that supports the following properties:<ul>
  98.      * <li><code>run</code> : Function<div class="sub-desc">The function to execute each time the task is run. The
  99.      * function will be called at each interval and passed the <code>args</code> argument if specified.  If a
  100.      * particular scope is required, be sure to specify it using the <code>scope</code> argument.</div></li>
  101.      * <li><code>interval</code> : Number<div class="sub-desc">The frequency in milliseconds with which the task
  102.      * should be executed.</div></li>
  103.      * <li><code>args</code> : Array<div class="sub-desc">(optional) An array of arguments to be passed to the function
  104.      * specified by <code>run</code>.</div></li>
  105.      * <li><code>scope</code> : Object<div class="sub-desc">(optional) The scope (<tt>this</tt> reference) in which to execute the
  106.      * <code>run</code> function. Defaults to the task config object.</div></li>
  107.      * <li><code>duration</code> : Number<div class="sub-desc">(optional) The length of time in milliseconds to execute
  108.      * the task before stopping automatically (defaults to indefinite).</div></li>
  109.      * <li><code>repeat</code> : Number<div class="sub-desc">(optional) The number of times to execute the task before
  110.      * stopping automatically (defaults to indefinite).</div></li>
  111.      * </ul>
  112.      * @return {Object} The task
  113.      */
  114.     this.start = function(task){
  115.         tasks.push(task);
  116.         task.taskStartTime = new Date().getTime();
  117.         task.taskRunTime = 0;
  118.         task.taskRunCount = 0;
  119.         startThread();
  120.         return task;
  121.     };
  122.     /**
  123.      * Stops an existing running task.
  124.      * @method stop
  125.      * @param {Object} task The task to stop
  126.      * @return {Object} The task
  127.      */
  128.     this.stop = function(task){
  129.         removeTask(task);
  130.         return task;
  131.     };
  132.     /**
  133.      * Stops all tasks that are currently running.
  134.      * @method stopAll
  135.      */
  136.     this.stopAll = function(){
  137.         stopThread();
  138.         for(var i = 0, len = tasks.length; i < len; i++){
  139.             if(tasks[i].onStop){
  140.                 tasks[i].onStop();
  141.             }
  142.         }
  143.         tasks = [];
  144.         removeQueue = [];
  145.     };
  146. };
  147. /**
  148.  * @class Ext.TaskMgr
  149.  * @extends Ext.util.TaskRunner
  150.  * A static {@link Ext.util.TaskRunner} instance that can be used to start and stop arbitrary tasks.  See
  151.  * {@link Ext.util.TaskRunner} for supported methods and task config properties.
  152.  * <pre><code>
  153. // Start a simple clock task that updates a div once per second
  154. var task = {
  155.     run: function(){
  156.         Ext.fly('clock').update(new Date().format('g:i:s A'));
  157.     },
  158.     interval: 1000 //1 second
  159. }
  160. Ext.TaskMgr.start(task);
  161. </code></pre>
  162.  * @singleton
  163.  */
  164. Ext.TaskMgr = new Ext.util.TaskRunner();