Fix #6913 - add more documentation to code
[roojs1] / Roo / util / TaskRunner.js
1 /*
2  * Based on:
3  * Ext JS Library 1.1.1
4  * Copyright(c) 2006-2007, Ext JS, LLC.
5  *
6  * Originally Released Under LGPL - original licence link has changed is not relivant.
7  *
8  * Fork - LGPL
9  * <script type="text/javascript">
10  */
11 /**
12  * @class Roo.util.TaskRunner
13  * Manage background tasks - not sure why this is better that setInterval?
14  * @static
15  *
16  */
17  
18 Roo.util.TaskRunner = function(interval){
19     interval = interval || 10;
20     var tasks = [], removeQueue = [];
21     var id = 0;
22     var running = false;
23
24     var stopThread = function(){
25         running = false;
26         clearInterval(id);
27         id = 0;
28     };
29
30     var startThread = function(){
31         if(!running){
32             running = true;
33             id = setInterval(runTasks, interval);
34         }
35     };
36
37     var removeTask = function(task){
38         removeQueue.push(task);
39         if(task.onStop){
40             task.onStop();
41         }
42     };
43
44     var runTasks = function(){
45         if(removeQueue.length > 0){
46             for(var i = 0, len = removeQueue.length; i < len; i++){
47                 tasks.remove(removeQueue[i]);
48             }
49             removeQueue = [];
50             if(tasks.length < 1){
51                 stopThread();
52                 return;
53             }
54         }
55         var now = new Date().getTime();
56         for(var i = 0, len = tasks.length; i < len; ++i){
57             var t = tasks[i];
58             var itime = now - t.taskRunTime;
59             if(t.interval <= itime){
60                 var rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]);
61                 t.taskRunTime = now;
62                 if(rt === false || t.taskRunCount === t.repeat){
63                     removeTask(t);
64                     return;
65                 }
66             }
67             if(t.duration && t.duration <= (now - t.taskStartTime)){
68                 removeTask(t);
69             }
70         }
71     };
72
73     /**
74      * Queues a new task.
75      * @param {Object} task
76      *
77      * Task property : interval = how frequent to run.
78      * Task object should implement
79      * function run()
80      * Task object may implement
81      * function onStop()
82      */
83     this.start = function(task){
84         tasks.push(task);
85         task.taskStartTime = new Date().getTime();
86         task.taskRunTime = 0;
87         task.taskRunCount = 0;
88         startThread();
89         return task;
90     };
91     /**
92      * Stop  new task.
93      * @param {Object} task
94      */
95     this.stop = function(task){
96         removeTask(task);
97         return task;
98     };
99     /**
100      * Stop all Tasks
101      */
102     this.stopAll = function(){
103         stopThread();
104         for(var i = 0, len = tasks.length; i < len; i++){
105             if(tasks[i].onStop){
106                 tasks[i].onStop();
107             }
108         }
109         tasks = [];
110         removeQueue = [];
111     };
112 };
113
114 Roo.TaskMgr = new Roo.util.TaskRunner();