【Lua学习】Lesson5.程序的时序、线程及任务同步

2023-10-30

基本时序

先把分析一下上一笔记中的代码

function LedRunning()

    --do something

    sys.timerStart(LedRunning,200) --200ms定时执行此函数

end

LedRunning()

首先是定义了一个功能函数,这个功能函数里面可以做一些事情,然后会发现里面有一个被注释为200ms定时执行此函数的一句,这个自瞄上看起来也很容易理解,传入的参数为func,ms,第一个是功能函数,第二个是定时周期(ms单位),然后再来看下详细的API:

这个有点类似于单片机上长跑的操作系统,例如freertos、ucos等等。在程序执行的过程中都是异步执行的,到了时间就执行定义的任务。当然上面所讲述的只是这个功能函数的定义,并没有实际调用,更不会自行循环调用,所以才有了后面的调用一句。为了简便也可以使用另外一个方法:

这样成个程序就更改成了

function LedRunning()

    --do something

end

sys.timerLoopStart(LedRunning,200) --200ms定时执行此函数

当然也可以更简洁的写:

sys.timerLoopStart(function()

 --do something

end,200)--200ms定时执行此函数

甚至写成一行都可以

sys.timerLoopStart(function() end,200)--200ms定时执行此函数

再来看一个比较熟悉的任务线程

这个就很容易理解了,目的就是初始化一个任务线程。

板上面的代码稍作修改就成了:

function LedRunning()

while ture do

    --do something

    sys.wait(200)  --挂起200ms

end

end

sys. taskInit (LedRunning)

这里的wait就是一个任务切换的过程。很容易理解吧。

上面的代码可以直接在sys.taskInit内写:

sys. taskInit (function ()

while ture do

    --do something

    sys.wait(200)  --挂起200ms

end

end

)

这里只是一个线程,所以当然多线程也是可以的,方法一样。

任务的同步

LuaTask可以使用订阅和发布,使某个程序等待另一个程序完成后才继续运行

我们来看最简单的一个示例代码:

代码段一:

--Taks1

sys.timerLoopStart(function()

print(“Task1 --> ”)

sys.publish(“Task1 Over”)

end,2000)--2000ms定时执行此函数

代码段二:

--Taks2

function Task2()

    sys.waitUntil(“Task1 Over”)

    print(“Task2\n”)

end

sys. taskInit (Task2)

代码段一非常简单,就是定义一个2s的定时任务,在任务里面打印“Task1 -->”,然后对外发布“Task1 Over”消息。

代码段二先是定义了一个功能函数,进去之后等待接收到“Task1 Over”这个消息,如果没有接收到就一直等,等到了就执行打印“Task2\n”,然后又把这个功能函数当作一个任务线程初始化,也就是专门开了一个任务循环执行这个功能函数。

从两段代码上来看也非常明了了,打印的结果应该是如下结果(我猜的,没测试)

Task1 --> Task2

Task1 --> Task2

。。。

Task1 --> Task2

这样就把两个任务同步了。

在回头看看api

 

其中发布和等待接收都是可以传入参数的,另外等待可以有最大时间限制,超过时间就不等了。

这里把传值的例子和输出结果贴上来:

sys.timerStart(function()

                   sys.publish("TEST",123)

               end,3000)--三秒定时执行发布"TEST"消息的函数



function Task2()

    result,data = sys.waitUntil("TEST")

    print(result,data)

end


sys.taskInit(Task2)

上述代码将会输出:

true    123

 

By Urien 2019年6月26日 10:17:07

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Lua学习】Lesson5.程序的时序、线程及任务同步 的相关文章

  • 为什么 LuaJIT 和 Lua 中的数字舍入格式不同?

    Using string format 据说遵循 Csprintf 在 LuaJIT 轮次中格式化数字与我尝试过的所有其他 Lua 解释器不同 lua v Lua 5 4 1 Copyright C 1994 2020 Lua org PU
  • 用于嵌入式服务器的 Web 技术

    我最近开始了一个针对嵌入式设备的新 Web 开发项目 并希望征求一些有关使用技术的建议 该设备将提供 HTML 页面 其中包括用于从 JSON 服务器检索数据的 AJAX 代码 我们暂时使用 Cherokee 作为 Web 服务器 但我们并
  • 如何在 Lua 中实现 OO?

    Lua 没有内置对 OO 的支持 但它允许您自己构建它 您能否分享一些实现面向对象的方法 请为每个答案写一个例子 如果您有更多示例 请发布另一个答案 我喜欢将 OOP 视为容器 对象 内的数据封装以及可以使用该数据完成的操作子集 还有很多内
  • Lua userdata:无法同时进行数组访问和方法

    我遇到了这个人的问题 Lua userdata数组访问及方法 https stackoverflow com questions 26970316 lua userdata array access and methods 其中 当我设置用
  • Lua :: 如何编写加载多个CPU的简单程序?

    我还无法用 Lua 编写一个可以加载多个 CPU 的程序 自从Lua通过协程支持这个概念 http www lua org pil 9 4 html 我相信这是可以实现的 我失败的原因可能是以下之一 这在Lua中是不可能的 我写不出来 an
  • 确定已编译Lua的编译器版本

    我有一些已编译的 LuaQ 我需要确定用于编译它的确切版本 有什么可能的方法吗 编译的脚本在文件开头有一个标头 4 bytes signature x1bLua 1 byte version 0x51 1 byte format 1 byt
  • 尝试将 nil 与数字堆栈回溯进行比较?

    我正在通过以下链接玩 Lua https www lua org pil 4 2 html https www lua org pil 4 2 html并对某一点感到困惑 Lua 5 2 4 Copyright C 1994 2015 Lu
  • 为什么 LuaJIT 这么好?

    编辑 不幸的是 LuaJIT 已从下面链接的比较中删除 This 比较 http shootout alioth debian org u64 which programming languages are fastest php编程语言的
  • Lua中如何在另一个表的表成员中搜索

    我正在编写一个 lua 程序 它有一个表 该表是另一个表的成员 当我向该成员表添加新日期时 一切正常 但是 当我想在该表中搜索时 无论我给出什么键 我总是会将最后一行添加到表中 如何在该成员表中正确搜索 Stream name functi
  • lua中的权限问题

    是否需要在 corona build settings 中设置一些特定权限才能将高分永久保存在文件中 每次运行代码时都会出现 权限被拒绝 的错误 如何纠正这个错误 这是我尝试过的代码 function read score local f1
  • 比较 Lua 中的日期

    我有一个带有日期表的变量 如下所示 table day number 15 year number 2015 month number 2 如何获取当前日期与上述日期之间的天数 非常感谢 您可以使用os time 将表转换为秒并获取当前时间
  • 如何通过 C API 在自己的环境中执行不受信任的 Lua 文件

    我想通过调用在其自己的环境中执行不受信任的 lua 文件lua setfenv http pgl yoyo org luai i lua setfenv这样它就不会影响我的任何代码 该函数的文档仅解释了如何调用函数 而不解释如何执行文件 目
  • 在 Awesome-wm 中为特定应用程序设置窗口布局

    如何配置很棒 以便它可以启动两个窗口对齐的新应用程序 如下所示 xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx 其中 x 是 pidgin 中的对话窗口 是好友列表窗口 一般来说 我想指定右窗口的宽度
  • 推送 Lua 表

    我已经创建了一个Lua表C 但我不知道如何将该表推入堆栈顶部 以便我可以将其传递给 Lua 函数 有谁知道如何做到这一点 这是我当前的代码 lua createtable state libraries size 0 int table i
  • 在 lua 中加载 C++ 模块时出现“尝试索引字符串值”错误

    我正在尝试使用 lua 用 C 编写的函数 下面给出的是cpp文件 extern C include lua h include lauxlib h include lualib h static int add 5 lua State L
  • 如何从 Lua 字符串中删除所有特殊字符、标点符号和空格?

    在Lua中 我只能找到其他语言的示例 如何从字符串中删除所有标点符号 特殊字符和空格 所以 举例来说 s t r i p p e d会成为stripped In Lua 模式 https www lua org manual 5 3 man
  • 模式 ^u.meta(\.|$) 未按预期工作

    我有这个模式 u meta 预期行为 u meta 将匹配所有角色 例如 u meta u meta admin u meta admin system u meta 它不应该匹配如下所示的内容 u meta admin u meta ad
  • Linq 是如何工作的(在幕后)?

    我正在考虑为 Lua 制作类似 Linq 的东西 并且我大致了解 Linq 的工作原理 但想知道是否有一篇好文章 或者是否有人可以解释 C 如何使 Linq 成为可能 注意 我的意思是在幕后 比如它如何生成代码绑定等等 而不是最终用户语法
  • 如何循环遍历表并保持顺序?

    我得到了下表 local a 12 30 24 60 60 year 30 24 60 60 month 24 60 60 day 60 60 hour 60 minute 1 second 但是 当我对它进行配对循环并打印 key val
  • 如何重载Lua字符串下标运算符?

    This debug getmetatable index function s i return s sub i i end 和这个 debug getmetatable index proc lua read 不起作用 Try debu

随机推荐