local co_time_tbl = {}
setmetatable(co_time_tbl, { __len = function(o)
local count =
for k, v in pairs(o) do
count = count +
end
return count
end
}) local function isWindows()
return package.config:sub(, ) == "\\"
end local function sleep(n)
if isWindows() then
if n > then
os.execute("ping -n " .. tonumber(n + ) .. " localhost > NUL")
end
else
os.execute("sleep " .. tonumber(n))
end
end local function Update(deltaTime)
-- main loop
end local function updateCoroutine()
local iTime = os.time()
for kco, vTime in pairs(co_time_tbl) do
if iTime >= vTime then
if coroutine.status(kco) == "suspended" or coroutine.status(kco) == "normal" then
coroutine.resume(kco)
elseif coroutine.status(kco) == "dead" then
co_time_tbl[kco] = nil
end
end
end
end function coroutine.waitforSeconds(second)
assert(type(second) == "number" or second <= )
local iEndTime = os.time() + second
local co = coroutine.running()
if co then
co_time_tbl[co] = iEndTime
return coroutine.yield()
end
end local function main()
local co1 = coroutine.wrap(function()
coroutine.waitforSeconds()
print("after 5 seconds")
end)
local co2 = coroutine.wrap(function()
coroutine.waitforSeconds()
print("after 4 seconds")
end)
local co3 = coroutine.wrap(function()
coroutine.waitforSeconds()
print("after 3 seconds")
end)
local count =
local co4 = coroutine.wrap(function()
while (true) do
coroutine.waitforSeconds()
count = count +
print("coroutine num: " .. #co_time_tbl .. " | second count:" .. count)
end
end)
co1()
co2()
co3()
co4()
while true do
sleep(0.033)
Update()
updateCoroutine()
end
end main()

思路其实就是用一张表维护协程要等待的时间,在主循环之后更新计时器,根据时间将挂起的协程唤醒就行

最新文章

  1. Web API系列
  2. Discuz 7.2 /faq.php SQL注入漏洞
  3. HDU 1011-Starship Troopers(树形背包)
  4. Javascript进阶篇——(DOM—节点---属性、访问节点)—笔记整理
  5. zongjie
  6. 关于用模拟器运行百度地图API无法定位的问题 - 不能用模拟器
  7. Tomcat与Nginx服务器的配合使用及各自的区别
  8. 指定时间生成cron表达式
  9. MySQL索引优化看这篇文章就够了!
  10. JavaScript 运行机制详解
  11. 国内常用NTP服务器地址及
  12. 约束布局 ConstraintLayout
  13. 配置go语言编辑环境 - goland
  14. USB Mass Storage大容量存储 The Thirteen Class章节的理解
  15. 学习react教程
  16. 第六节 Go数据结构之集合
  17. 使用MATLAB设计FIR滤波器
  18. ATL7窗口类详细剖析
  19. 分布式缓存系统 Memcached 数据存储slab与hashtable
  20. 【洛谷P2426】删数

热门文章

  1. vue-导入element-ui
  2. eclipse CDT Error: Program &quot;g++&quot; not found in PATH
  3. dll程序开发总结
  4. vue 组件之间通信
  5. vue 高德地图
  6. C++ list 查找
  7. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_05-freemarker基础-List指令
  8. ElasticSearch——分页查询
  9. mudos源码分析
  10. Cocos Creator Android打包 apk