summaryrefslogtreecommitdiff
path: root/src/01-coroutine/test.lua
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-09-17 08:07:08 +0800
committerchai <chaifix@163.com>2019-09-17 08:07:08 +0800
commitea55f90b49fbfb740a9aec66b4c40060542dc444 (patch)
tree6d98b3f198ed63947de9b3d42b54e93abfc43c61 /src/01-coroutine/test.lua
+init
Diffstat (limited to 'src/01-coroutine/test.lua')
-rw-r--r--src/01-coroutine/test.lua112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/01-coroutine/test.lua b/src/01-coroutine/test.lua
new file mode 100644
index 0000000..8735082
--- /dev/null
+++ b/src/01-coroutine/test.lua
@@ -0,0 +1,112 @@
+
+local watchdog = {
+ m_ThreadsWaitOnTime = {}, -- [coroutine] = second
+ m_ThreadsWaitOnSignal = {}, -- [signal] = {coroutines}
+ m_Time = 0,
+
+ Update = function(dog, dt)
+ dog.m_Time = dog.m_Time + dt
+
+ local threadsToWake = {}
+
+ for co, wakeupTime in pairs(dog.m_ThreadsWaitOnTime) do
+ if wakeupTime < dog.m_Time then
+ dog.m_ThreadsWaitOnTime[co] = nil
+ table.insert(threadsToWake, co)
+ end
+ end
+
+ for _, co in pairs(threadsToWake) do
+ coroutine.resume(co)
+ end
+ end ,
+ GetTime = function(dog)
+ return dog.m_Time
+ end ,
+ AddWaitOnTime = function(dog, co, sec)
+ dog.m_ThreadsWaitOnTime[co] = sec
+ end ,
+ AddWaitOnSignal = function(dog, co, cmd)
+ dog.m_ThreadsWaitOnSignal[cmd] = dog.m_ThreadsWaitOnSignal[cmd] or {}
+ table.insert(dog.m_ThreadsWaitOnSignal[cmd], co)
+ end ,
+ Signal = function(dog, command)
+ print("Signal " .. command)
+ local thread = dog.m_ThreadsWaitOnSignal[command]
+ if thread == nil then
+ print("Invalid signal")
+ return nil
+ end
+ dog.m_ThreadsWaitOnSignal[command] = nil
+ for _, co in pairs(thread) do
+ coroutine.resume(co)
+ end
+ end
+}
+
+local function wait(param)
+ local co = coroutine.running()
+ assert(co ~= nil, "the main coroutine cant wait")
+ if type(param) == "number" then
+ local wakeupTime = watchdog:GetTime() + param
+ print("Wait " .. param .." Sec, until " .. string.format("%.2f", wakeupTime).. " Sec")
+ watchdog:AddWaitOnTime(co, wakeupTime)
+ return coroutine.yield()
+ elseif type(param) == "string" then
+ print("Wait Signal " .. param)
+ watchdog:AddWaitOnSignal(co, param)
+ return coroutine.yield()
+ end
+end
+
+local function speaker()
+ print("Speaker: Start")
+ wait(2) --等2秒
+ print("Speaker: I'm speaker.")
+ wait(2) --等2秒
+ print("Speaker: And I like game and programming.")
+ wait(2) --等2秒
+ print("Speaker: Nice to meet you!")
+ wait("kick") --等kick信号
+ print("Speaker: You hurt me!")
+ wait("sorry") --等sorry信号
+ print("Speaker: That's ok.")
+end
+
+local signal = function(cmd)
+ watchdog:Signal(cmd)
+end
+
+local command = ""
+local GetInput = function()
+ if Kbhit() then
+ local c = GetChar()
+ if c == '\r' then
+ signal(command)
+ command = ""
+ else
+ print("Input: " .. c)
+ command = command .. c
+ end
+ end
+end
+
+local function main()
+ local pre = 0
+ local dt = 0
+ local co = coroutine.create(speaker)
+ coroutine.resume(co)
+ while true do
+ local cur = GetTime()
+ dt = cur - pre
+ pre = cur
+
+ GetInput()
+
+ watchdog:Update(dt)
+
+ Sleep(0.016)
+ end
+end
+
+xpcall(main, debug.traceback, 10)