From 65a4dfa9c9d41780fb2775e3999d3917e18ccd07 Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 12 Jun 2017 11:07:56 -0400 Subject: [PATCH] Core Addition (1.5.0) Updated version from 1.4.1 to 1.5.0 Added: multiObj:SetTime(n) multiObj:ResetTime(n) multiObj:ResolveTimer(...) multiObj:OnTimedOut([function(self)]) multiObj:OnTimerResolved([function(self)],...) Added: multi:getVersion() Example will be posted in the readme --- README.md | 59 ++++++++++++++++++++++++++++++++++++++++++++++++-- multi/init.lua | 43 +++++++++++++++++++++++++++++++++++- test.lua | 27 +++++++++++++++++++++++ 3 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 test.lua diff --git a/README.md b/README.md index 3ed1047..effe97f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,11 @@ -# multi Version: 1.4.1 +# multi Version: 1.5.0 +Updated from 1.4.1 +Added: +- An easy way to manage timeouts +- Small bug fixes + +Example at end of the readme + My multitasking library for lua
To install copy the multi folder into your enviroment and you are good to go
@@ -697,6 +704,54 @@ multi:mainloop() ...
.inf-1 inf
+Timeout management +```lua +-- Note: I used a tloop so I could control the output of the program a bit. +require("multi.tloop") +a=0 +inc=1 -- change to 0 to see it not met at all, 1 if you want to see the first condition not met but the second and 2 if you want to see it meet the condition on the first go. +loop=multi:newTLoop(function(self) + print("Looping...") + a=a+inc + if a==14 then + self:ResolveTimer("1","2","3") -- ... any number of arguments can be passed to the resolve handler + -- this will also automatically pause the object that it is binded to + end +end,.1) +loop:SetTime(1) +loop:OnTimerResolved(function(self,a,b,c) -- the handler will return the self and the passed arguments + print("We did it!",a,b,c) +end) +loop:OnTimedOut(function(self) + if not TheSecondTry then + print("Loop timed out!",self.Type,"Trying again...") + self:ResetTime(2) + self:Resume() + TheSecondTry=true + else + print("We just couldn't do it!") -- print if we don't get anything working + end +end) +multi:mainloop() +``` +# Output (Change the value inc as indicated in the comment to see the outcomes!) +Looping...
+Looping...
+Looping...
+Looping...
+Looping...
+Looping...
+Looping...
+Looping...
+Looping...
+Loop timed out! tloop Trying again...
+Looping...
+Looping...
+Looping...
+Looping...
+Looping...
+We did it! 1 2 3
+ # TODO (In order of importance) -- Write the wiki stuff
+- Write the wiki stuff. (There are a lot of undocumented, but useful features that make automation of spawning a lot of different multiObject types eaiser, etc... To do really soon!)
- Test for unknown bugs
diff --git a/multi/init.lua b/multi/init.lua index 0d97c6b..b3b0913 100644 --- a/multi/init.lua +++ b/multi/init.lua @@ -22,7 +22,7 @@ function print(...) end end multi = {} -multi.Version={'A',4,1} +multi.Version={1,5,0} multi.stage='stable' multi.__index = multi multi.Mainloop={} @@ -208,6 +208,9 @@ end function multi:getChildren() return self.Mainloop end +function multi:getVersion() + return multi.Version[1].."."..multi.Version[2].."."multi.Version[3] +end --Processor function multi:getError() if self.error then @@ -459,6 +462,42 @@ end function multi:Sleep(n) self:hold(n) end +-- Advance Timer stuff +function multi:SetTime(n) + if not n then n=3 end + local c=multi:newBase() + c.Type='timemaster' + c.timer=multi:newTimer() + c.timer:Start() + c.set=n + c.link=self + self._timer=c.timer + function c:Act() + if self.timer:Get()>=self.set then + self.link:Pause() + for i=1,#self.link.funcTM do + self.link.funcTM[i](self.link) + end + self:Destroy() + end + end + return c +end +multi.ResetTime=multi.SetTime +function multi:ResolveTimer(...) + self._timer:Pause() + for i=1,#self.funcTMR do + self.funcTMR[i](self,...) + end + self:Pause() +end +function multi:OnTimedOut(func) + self.funcTM[#self.funcTM+1]=func +end +function multi:OnTimerResolved(func) + self.funcTMR[#self.funcTMR+1]=func +end +-- Timer stuff done function multi:Pause() if self.Type=='mainprocess' then print("You cannot pause the main process. Doing so will stop all methods and freeze your program! However if you still want to use multi:_Pause()") @@ -583,6 +622,8 @@ function multi:newBase(ins) end c.Active=true c.func={} + c.funcTM={} + c.funcTMR={} c.ender={} c.Id=0 c.PId=0 diff --git a/test.lua b/test.lua new file mode 100644 index 0000000..652684c --- /dev/null +++ b/test.lua @@ -0,0 +1,27 @@ +package.path="?/init.lua;"..package.path +require("multi.tloop") +a=0 +inc=1 -- change to 0 to see it not met at all, 1 if you want to see the first condition not met but the second and 2 if you want to see it meet the condition on the first go. +loop=multi:newTLoop(function(self) + print("Looping...") + a=a+inc + if a==14 then + self:ResolveTimer("1","2","3") -- ... any number of arguments can be passed to the resolve handler + -- this will also automatically pause the object that it is binded to + end +end,.1) +loop:SetTime(1) +loop:OnTimerResolved(function(self,a,b,c) -- the handler will return the self and the passed arguments + print("We did it!",a,b,c) +end) +loop:OnTimedOut(function(self) + if not TheSecondTry then + print("Loop timed out!",self.Type,"Trying again...") + self:ResetTime(2) + self:Resume() + TheSecondTry=true + else + print("We just couldn't do it!") -- print if we don't get anything working + end +end) +multi:mainloop()