-- CPM:关键路径法(Critical Path Method)
jobBase = {
    schedule = function ( self, job, task, ... ) --由具体job构造任务列表
        local finale = false
        local msg = nil
        local rc = nil
        local params = table.pack(self, task, ...)
        repeat
            ];
            local fn = job[task]
            if type(fn) == "function"
            )) end
            finale = (task == "finale")
            msg = self.name.."["..task.."] done!"
            if not finale
            then
                -- yield 传回进度描述及任务反馈
                -- 打包调度入参
                params = table.pack(coroutine.yield(msg, rc))
            end
        until finale
        self.co = nil -- over
        return msg, rc
    end;
    perform = function ( self, task, ... )
        local co = self.co or coroutine.create(self.schedule)
        if self.co == nil
        then self.co = co end
        return coroutine.resume(co, self, task, ...)
    end;
}--jobBase
---------------------------------------------------------------
--记得华罗庚的统筹方法论对烧水泡茶的描述过程
--就是多任务协调的执行程序
--示例:project, another两项任务节点的调度与描述
--{}, 构造描述的脚本模式
local project = {
    name = "projectSample";
    perform = jobBase.perform;
    schedule = function ( self, task, ... )
        local todo = {
        ["stage1"] = function()
        end;
        ["stage2"] = function()
        end;
        ["stage3"] = function()
        end;
        ["finale"] = function()end;
        }
        return jobBase.schedule(self, todo, task, ...)
    end
}
--记得区分对象调用与域调用,一不小心就写成. 就无法识别self了
print(project:perform("stage1"))
--creator, object based; 基于创建对象,对象扩展的脚本模式
function jobBase.create( name )
    local o = {name = name}
    return setmetatable(o, {__index = jobBase})
end
local another = jobBase.create("anotherProject")
function another:schedule( task, ... )
    local todo = {
    ["stage1"] = function()
    end;
    ["stage2"] = function()
    end;
    ["finale"] = function()end;
    }
    return getmetatable(self).__index.schedule(self, todo, task, ...)
end
print(another:perform("stage1"))
print(project:perform("stage2"))
print(project:perform("stage3"))
print(another:perform("stage2"))
print(project:perform("finale"))
print(another:perform("finale"))

本贴代码重点,提示两种脚本应用模式。构造描述的对象模式;基于创建方法,对象扩展的脚本模式。

此例演示coroutine用于多任务协同,统筹方法的一种脚本描述。

[lua]协同式多任务,统筹运用的更多相关文章

  1. 使用KEIL C51实现的简单合作式多任务操作系统内核(单片机实现版本)

    基于网上网友的代码,自己在单片机上实现, 特此记录分享之. 基于https://blog.csdn.net/yyx112358/article/details/78877523 //使用KEIL C5 ...

  2. Lua 协同程序(coroutine)

    什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西. 协同是非常 ...

  3. Lua 学习之基础篇九<Lua 协同程序(Coroutine)>

    引言 讲到协程,首先来介绍一下线程和协程的区别 lua协程和多线程 相同之处:拥有自己独立的桟.局部变量和PC计数器,同时又与其他协程共享全局变量和其他大部分东西 不同之处:一个多线程程序可以同时运行 ...

  4. ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务

    ★PART1:中断和异常概述 1. 中断(Interrupt) 中断包括硬件中断和软中断.硬件中断是由外围设备发出的中断信号引发的,以请求处理器提供服务.当I/O接口发出中断请求的时候,会被像8259 ...

  5. x86架构:保护模式下利用中断实现抢占式多任务运行

         站在用户角度考虑,一个合格的操作系统即使在单核下也能 "同时" 执行多个任务,这就要求CPU以非常快的频率在不同任务之间切换,让普通人根本感觉不到任务的切换.windwo ...

  6. [lua]再版jobSchedule与脚本描述范型

    首先贴上代码 -- CPM:关键路径法(Critical Path Method) jobSchedule = { todos = { -- todo list ... ["finale&q ...

  7. Windows消息机制要点

    1. 窗口过程     每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wP ...

  8. 转:Windows消息机制要点

    Windows消息机制要点 1. 窗口过程     每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ...

  9. DUI-Windows消息机制要点(34篇)

    [隐藏] 1窗口过程概念 2消息类型 2.1系统定义消息 2.1.1窗口消息 2.1.2命令消息 2.1.3控件通知消息 2.1.4程序定义消息 3消息队列 3.1系统消息队列 3.2线程消息队列 4 ...

随机推荐

  1. android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)

    一.摄像头工作原理 上一篇我们讲了摄像头模组的组成,工作原理,做为一种了解.下面我们析摄像头从寄存器角度是怎么工作的.如何阅读摄像头规格书(针对驱动调节时用到关键参数,以GT2005为例). 规格书, ...

  2. java-mina(nio 框架)

    mina是对nio的具体实现.是目前比较高效和流行的nio框架了. 下面是对使用mina进行通讯的一个简单demo,后面再用mina写一个RPC的简单框架.   mina主要包括: (使用的mina版 ...

  3. linux内核--软中断与tasklet

    硬件中断通常都需要在最短的时间内执行完毕,如果将所有硬件中断相关的处理都放在硬件中断处理程序中,那么就达不到这个目的. 通过linux提供的软中断和tasklet,可以将硬件中断处理程序中可以延迟处理 ...

  4. SpringMVC 常用注解

    本文参考了博客,具体请见:http://www.cnblogs.com/leskang/p/5445698.html Spring MVC的常用注解 1.@Controller @Controller ...

  5. 如何学会web前端开发

    如何学会web前端开发 http://jingyan.baidu.com/article/b7001fe17623970e7282dd0c.html http://www.yangqq.com/dow ...

  6. ACM 关于数据输入加速

    转载请注明出处:http://blog.csdn.net/a1dark 分析:我们都知道运行时间对我们来说很重要.有时候不惜用大量的内存去换取一点时间.有些人可能都比较关注这个问题.首先时间上:cin ...

  7. [D3] 9. Scatter Plot

    Up until now we've just looked at bar charts. A handy chart, no doubt, but D3 offers a variety of ch ...

  8. 【转】cocos2d-x使用第三方的TTF字体库

    步骤一:找一个ttf字体库 步骤二:找到这个ttf字体库的真实名称 打开你的应用 "字体册"(MAC OS系统下),如下图操作): 找到了字体库真实名称,那么修改将其真名作为为此新 ...

  9. Linux 安装 Python3.5

    1. 准备 操作系统:Red Hat Enterprise Linux Server release 6.5 (Santiago) Python 安装包:Python-3.5.2.tgz 下载地址:h ...

  10. GUI编程笔记(java)02:java.awt和java.swing包的区别

    1. java.awt和java.swing两者的概述 java.awt:(java的标准包)             Abstract Window ToolKit (抽象窗口工具包),需要调用本地 ...