diff --git a/Kernel/Task.cpp b/Kernel/Task.cpp index b0ea1297..a1e8b4b1 100644 --- a/Kernel/Task.cpp +++ b/Kernel/Task.cpp @@ -173,6 +173,9 @@ TaskScheduler::TaskScheduler(cstring name) LastTrace = Sys.Ms(); _SkipSleep = false; + + EnterSleep = nullptr; + ExitSleep = nullptr; } // 使用外部缓冲区初始化任务列表,避免频繁的堆分配 @@ -353,7 +356,11 @@ INROOT void TaskScheduler::Execute(uint msMax, bool& cancel) { min -= now; Sleeping = true; - Time.Sleep(min, &Sleeping); + // 通知外部,需要睡眠若干毫秒 + if(EnterSleep) + EnterSleep(min); + else + Time.Sleep(min, &Sleeping); Sleeping = false; // 累加睡眠时间 @@ -400,6 +407,9 @@ INROOT void TaskScheduler::SkipSleep() { _SkipSleep = true; Sleeping = false; + + // 通知外部,要求退出睡眠,恢复调度 + if(ExitSleep) ExitSleep(); } // 显示状态 diff --git a/Kernel/Task.h b/Kernel/Task.h index aff5f348..acd2ae80 100644 --- a/Kernel/Task.h +++ b/Kernel/Task.h @@ -77,6 +77,10 @@ public: UInt64 TotalSleep; // 所有任务的总睡眠时间ms UInt64 LastTrace; // 最后统计跟踪时间ms + typedef void (*SAction)(uint ms); + SAction EnterSleep; // 通知外部,需要睡眠若干毫秒 + Func ExitSleep; // 通知外部,要求退出睡眠,恢复调度 + TaskScheduler(cstring name = nullptr); // 使用外部缓冲区初始化任务列表,避免频繁的堆分配