合宙Air780EG开发板系列教程—05 基于sys库的LuaTask框架(基于luatos的开发)

框架简述

LuaTask框架,利用协程,在Lua中实现了多任务功能。开发者可以用最简单的方式,新建多个任务,而不是像传统的开发方式一样,只能用定时器进行延时。
当使用LuaTask框架时,需要在代码中引用sys库(_G.sys=require(“sys”)),并且在代码的最后一行,调用sys.run()以启动LuaTask框架,框架内的任务代码会在sys.run()中运行。

线上运行lua程序

给大家介绍一个可以线上测试lua的地址,点击:线上lua测试
–此处为纯lua5.3测试场地
–同时,支持加载sys库,使用task框架特性
下面的例子就在线上测试,比较方便

一、多任务

例:

sys = require("sys")
--第一个任务
sys.taskInit(function()
    while true do
        log.info("task1","heihei")
        sys.wait(1000) --延时1秒,这段时间里可以运行其他代码
    end
end)

--第二个任务
sys.taskInit(function()
    while true do
        log.info("task2","haha")
        sys.wait(500) --延时0.5秒,这段时间里可以运行其他代码
    end
end)

sys.run()

在这里插入图片描述

二、多任务之间互相等待

例:

sys = require("sys")
--第一个任务
sys.taskInit(function()
    while true do
        log.info("task1","wow")
        sys.wait(1000) --延时1秒,这段时间里可以运行其他代码
        sys.publish("TASK1_DONE")--发布这个消息,此时所有在等的都会收到这条消息
    end
end)

--第二个任务
sys.taskInit(function()
    while true do
        sys.waitUntil("TASK1_DONE")--等待这个消息,这个任务阻塞在这里了
        log.info("task2","wow")
    end
end)

--第三个任务
sys.taskInit(function()
    while true do
        local result = sys.waitUntil("TASK1_DONE",500)--等待超时时间500ms,超过就返回false而且不等了
        log.info("task3","wait result",result)
    end
end)

--单独订阅,可以当回调来用
sys.subscribe("TASK1_DONE",function()
    log.info("subscribe","wow")
end)

sys.run()

在这里插入图片描述先运行第一个任务延时一秒,第二个任务和第三个任务都没收到消息发布,所以阻塞在这样(三个任务都是同步运行的,我说的阻塞是指 sys.waitUntil这个函数)
第二个任务等待500ms没有消息发布,直接返回false不等了,执行后面代码
第三个任务没有等待时间,在消息发布之前会一直阻塞,直到等到消息发布,第一个任务在延时1s后发布消息,第三个任务的 sys.waitUntil 接收到了消息,开始执行后面的代码
sys.subscribe也订阅了"subscribe",所以第一个任务延时一秒后发布"subscribe"消息, sys.subscribe也会执行。

  • sys.taskInit 可以简单理解为多线程,如果不懂的可以这样理解,我刚学的时候就是这样理解的,但不完全等于

三、多任务之间互相等待并传递数据

例:

sys = require("sys")
--第一个任务
sys.taskInit(function()
    while true do
        log.info("task1","heihei")
        sys.wait(1000) --延时1秒,这段时间里可以运行其他代码
        sys.publish("TASK1_DONE","balabala")--发布这个消息,并且带上一个数据
    end
end)

--第二个任务
sys.taskInit(function()
    while true do
        local result,data = sys.waitUntil("TASK1_DONE")--等待这个消息,这个任务阻塞在这里了
        log.info("task2","haha receive",data)
    end
end)

--第三个任务
sys.taskInit(function()
    while true do
        local result,data = sys.waitUntil("TASK1_DONE",500)--等待超时时间500ms,超过就返回false而且不等了
        log.info("task3","wait result",result,data)
    end
end)

--单独订阅,可以当回调来用
sys.subscribe("TASK1_DONE",function(data)
    log.info("subscribe","heihei receive",data)
end)

sys.run()

在这里插入图片描述
这个例子只是在例二的 sys.publish 发布消息时附带了一条数据

四、传统定时器

例:

sys = require("sys")

--一秒后执行某函数,可以在后面传递参数
sys.timerStart(log.info,1000,"1s timer")
--之间写个function也行
sys.timerStart(function()
    log.info("1s timer function")
end,1000)

--每秒执行,永久循环,返回定时器编号
local loopId = sys.timerLoopStart(log.info,1000,"1s loop timer")
--10秒后手动停止上面的无限循环定时器
sys.timerStart(function()
    sys.timerStop(loopId)
    log.info("stop 1s loop timer")
end,10000)

sys.run()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值