升级任务调度器,支持创建事件型任务

This commit is contained in:
nnhy 2015-08-05 04:39:24 +00:00
parent 2d250a4df2
commit 2c6e768654
4 changed files with 33 additions and 10 deletions

12
Sys.cpp
View File

@ -552,7 +552,7 @@ void TSys::ToHex(byte* buf, byte* src, uint len)
#include "Task.h"
// 创建任务返回任务编号。priority优先级dueTime首次调度时间usperiod调度间隔us-1表示仅处理一次
uint TSys::AddTask(Action func, void* param, ulong dueTime, long period, string name)
uint TSys::AddTask(Action func, void* param, long dueTime, long period, string name)
{
return Scheduler.Add(func, param, dueTime, period, name);
}
@ -562,6 +562,16 @@ void TSys::RemoveTask(uint taskid)
Scheduler.Remove(taskid);
}
bool TSys::SetTask(uint taskid, bool enable)
{
Task* task = Scheduler[taskid];
if(!task) return false;
task->Enable = enable;
return true;
}
void TSys::Start()
{
#if DEBUG

3
Sys.h
View File

@ -130,8 +130,9 @@ private:
public:
// 创建任务返回任务编号。dueTime首次调度时间usperiod调度间隔us-1表示仅处理一次
uint AddTask(Action func, void* param, ulong dueTime = 0, long period = 0, string name = NULL);
uint AddTask(Action func, void* param, long dueTime = 0, long period = 0, string name = NULL);
void RemoveTask(uint taskid);
bool SetTask(uint taskid, bool enable);
void Start(); // 开始系统大循环
Func OnStart;
};

View File

@ -30,9 +30,10 @@ void Task::Execute(ulong now)
TimeCost tc;
SleepTime = 0;
Task* cur = _Scheduler->Current;
_Scheduler->Current = this;
Callback(Param);
_Scheduler->Current = NULL;
_Scheduler->Current = cur;
// 累加任务执行次数和时间
Times++;
@ -51,8 +52,12 @@ void Task::Execute(ulong now)
if(cost > 500000) debug_printf("Task::Execute 任务 %d [%d] 执行时间过长 %dus 睡眠 %dus\r\n", ID, Times, cost, SleepTime);
#endif
// 如果是事件型任务,这里禁用
if(NextTime < 0)
Enable = false;
// 如果只是一次性任务,在这里清理
if(Period < 0) _Scheduler->Remove(ID);
else if(Period < 0)
_Scheduler->Remove(ID);
}
// 显示状态
@ -95,8 +100,8 @@ TaskScheduler::~TaskScheduler()
_Tasks.DeleteAll().Clear();
}
// 创建任务返回任务编号。dueTime首次调度时间usperiod调度间隔us-1表示仅处理一次
uint TaskScheduler::Add(Action func, void* param, ulong dueTime, long period, string name)
// 创建任务返回任务编号。dueTime首次调度时间us-1表示事件型任务period调度间隔us-1表示仅处理一次
uint TaskScheduler::Add(Action func, void* param, long dueTime, long period, string name)
{
Task* task = new Task(this);
task->ID = _gid++;
@ -104,7 +109,14 @@ uint TaskScheduler::Add(Action func, void* param, ulong dueTime, long period, st
task->Callback = func;
task->Param = param;
task->Period = period;
task->NextTime = Time.Current() + dueTime;
if(dueTime < 0)
{
task->NextTime = dueTime;
task->Enable = false;
}
else
task->NextTime = Time.Current() + dueTime;
Count++;
_Tasks.Add(task);

6
Task.h
View File

@ -27,7 +27,7 @@ public:
void* Param; // 参数
long Period; // 周期us
ulong NextTime; // 下一次执行时间
long NextTime; // 下一次执行时间
int Times; // 执行次数
int CpuTime; // 总耗费时间
@ -66,8 +66,8 @@ public:
TaskScheduler(string name = NULL);
~TaskScheduler();
// 创建任务返回任务编号。dueTime首次调度时间usperiod调度间隔us-1表示仅处理一次
uint Add(Action func, void* param, ulong dueTime = 0, long period = 0, string name = NULL);
// 创建任务返回任务编号。dueTime首次调度时间us-1表示事件型任务period调度间隔us-1表示仅处理一次
uint Add(Action func, void* param, long dueTime = 0, long period = 0, string name = NULL);
void Remove(uint taskid);
void Start();