Skip to content

Commit b9a4293

Browse files
committed
task controller 0.0.2
1 parent f80d4e9 commit b9a4293

File tree

1 file changed

+131
-0
lines changed

1 file changed

+131
-0
lines changed

libs/TaskController-0.0.2.js

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
function TaskController() {
2+
this.tasks = {};
3+
this.isRunning = false;
4+
this.interval = 50;
5+
};
6+
7+
TaskController.prototype.getFirstPriorityTaskName = function() {
8+
var pTask = null;
9+
var priority = 100;
10+
var now = Date.now();
11+
for (var name in this.tasks) {
12+
var task = this.tasks[name];
13+
if (now - task.lastRunTime < task.interval) {
14+
continue;
15+
}
16+
if (pTask === null) {
17+
pTask = task;
18+
continue;
19+
}
20+
if (task.wait < pTask.wait) {
21+
pTask = task;
22+
continue;
23+
}
24+
if (task.interval > pTask.interval) {
25+
pTask = task;
26+
continue;
27+
}
28+
if (task.lastRunTime < pTask.lastRunTime) {
29+
pTask = task;
30+
continue;
31+
}
32+
}
33+
if (pTask === null) {
34+
return '';
35+
}
36+
pTask.wait += pTask.priority;
37+
return pTask.name;
38+
}
39+
40+
TaskController.prototype.loop = function () {
41+
console.log('loop start');
42+
while(this.isRunning) {
43+
var taskName = this.getFirstPriorityTaskName();
44+
var task = this.tasks[taskName];
45+
if (task !== undefined) {
46+
task.run();
47+
task.lastRunTime = Date.now();
48+
task.runTimes--;
49+
if (task.runTimes === 0) {
50+
delete this.tasks[taskName];
51+
}
52+
}
53+
sleep(this.interval);
54+
}
55+
this.isRunning = false;
56+
console.log('loop stop');
57+
}
58+
59+
TaskController.prototype.updateRunInterval = function(interval) {
60+
if(interval < this.interval && interval >= 50) {
61+
// min interval = 50
62+
this.interval = interval;
63+
}
64+
}
65+
66+
TaskController.prototype.newTaskObject = function (name, func, interval, runTimes, priority) {
67+
var task = {
68+
name: name,
69+
run: func,
70+
interval: interval || 1000, // 1 second
71+
runTimes: runTimes || 0, // <= 0 unlimit
72+
priority: priority, // same as linux, user can not controll this
73+
wait: 0, // when to run, releate to priority
74+
lastRunTime: 0, // last run time in millis
75+
};
76+
return task;
77+
}
78+
79+
TaskController.prototype.newTask = function (name, func, interval, runTimes, nextRun, priority = 5) {
80+
if (nextRun === undefined) {
81+
nextRun = false;
82+
}
83+
if (typeof func !== 'function') {
84+
console.log('Error not a function', name, func);
85+
return;
86+
}
87+
var newTask = this.newTaskObject(name, func, interval, runTimes, priority);
88+
if (nextRun) {
89+
newTask.lastRunTime = Date.now();
90+
}
91+
this.updateRunInterval(newTask.interval);
92+
93+
var taskName = 'system_newTask_' + name;
94+
var sysTask = this.newTaskObject(taskName, function() {
95+
this.tasks[name] = newTask;
96+
}.bind(this), 0, 1, 1);
97+
this.tasks[taskName] = sysTask;
98+
return newTask;
99+
};
100+
101+
TaskController.prototype.removeTask = function (name) {
102+
var taskName = 'system_removeTask_' + Date.now().toString();
103+
var sysTask = this.newTaskObject(taskName, function() {
104+
delete this.tasks[name];
105+
}.bind(this), 0, 1, 1);
106+
this.tasks[taskName] = sysTask;
107+
}
108+
109+
TaskController.prototype.removeAllTasks = function() {
110+
var taskName = 'system_removeAllTask_' + Date.now().toString();
111+
var sysTask = this.newTaskObject(taskName, function() {
112+
for(var k in this.tasks) {
113+
delete this.tasks[k];
114+
}
115+
}.bind(this), 0, 1, 1);
116+
this.tasks[taskName] = sysTask;
117+
}
118+
119+
TaskController.prototype.start = function () {
120+
if (!this.isRunning) {
121+
this.isRunning = true;
122+
this.loop();
123+
}
124+
}
125+
126+
TaskController.prototype.stop = function () {
127+
if (this.isRunning) {
128+
this.isRunning = false;
129+
console.log('wait loop stop...');
130+
}
131+
}

0 commit comments

Comments
 (0)