mirror of
https://github.com/rayaman/multi.git
synced 2026-09-05 07:27:35 -04:00
Updated to 1.8.0
Added: SystemThreadedBenchmark SystemThreadedQueue Fixed a bunch of bugs in the intergrations and regular multi objects Fixed Error management in threads All errors trigger the multi.OnError connection Module creation support improved added more examples added Type to threaded objects
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
-- Tick Tock Example
|
||||
require("multi")
|
||||
alarm=multi:newAlarm(1)
|
||||
alarm.state=-1 -- set the state to -1
|
||||
alarm.sounds={[-1]="Tick",[1]="Tock"} -- this makes changing between states easy and fast
|
||||
alarm:OnRing(function(self)
|
||||
print(self.sounds[self.state])
|
||||
self.state=self.state*-1 -- change the state in one line
|
||||
self:Reset() -- Reset the alarm so it runs again
|
||||
end)
|
||||
multi:mainloop()
|
||||
@@ -0,0 +1,27 @@
|
||||
local GLOBAL,sThread=require("multi.intergration.lanesManager").init()
|
||||
queue=multi:newSystemThreadedQueue("QUEUE"):init()
|
||||
queue:push("This is a test")
|
||||
queue:push("This is a test2")
|
||||
queue:push("This is a test3")
|
||||
queue:push("This is a test4")
|
||||
multi:newSystemThread("test2",function()
|
||||
queue=sThread.waitFor("QUEUE"):init()
|
||||
data=queue:pop()
|
||||
while data do
|
||||
print(data)
|
||||
data=queue:pop()
|
||||
end
|
||||
queue:push("This is a test5")
|
||||
queue:push("This is a test6")
|
||||
queue:push("This is a test7")
|
||||
queue:push("This is a test8")
|
||||
end)
|
||||
multi:newThread("test!",function() -- this is a lua thread
|
||||
thread.sleep(.1)
|
||||
data=queue:pop()
|
||||
while data do
|
||||
print(data)
|
||||
data=queue:pop()
|
||||
end
|
||||
end)
|
||||
multi:mainloop()
|
||||
@@ -0,0 +1,28 @@
|
||||
package.path="?/init.lua;"..package.path -- slightly different usage of the code
|
||||
local GLOBAL,sThread=require("multi.intergration.lanesManager").init()
|
||||
queue=multi:newSystemThreadedQueue("QUEUE")
|
||||
queue:push(1)
|
||||
queue:push(2)
|
||||
queue:push(3)
|
||||
queue:push(4)
|
||||
queue:push(5)
|
||||
queue:push(6)
|
||||
multi:newSystemThread("STHREAD_1",function()
|
||||
queue=sThread.waitFor("QUEUE"):init()
|
||||
GLOBAL["QUEUE"]=nil
|
||||
data=queue:pop()
|
||||
while data do
|
||||
print(data)
|
||||
data=queue:pop()
|
||||
end
|
||||
end)
|
||||
multi:newThread("THREAD_1",function()
|
||||
while true do
|
||||
if GLOBAL["QUEUE"]==nil then
|
||||
print("Deleted a Global!")
|
||||
break
|
||||
end
|
||||
thread.skip(1)
|
||||
end
|
||||
end)
|
||||
multi:mainloop()
|
||||
@@ -0,0 +1,9 @@
|
||||
-- like the while loop (kinda)
|
||||
require("multi")
|
||||
loop=multi:newLoop(function(self,dt)
|
||||
if dt>10 then
|
||||
print("Enough time has passed!")
|
||||
self:Break() -- lets break this thing
|
||||
end
|
||||
end)
|
||||
multi:mainloop()
|
||||
@@ -0,0 +1,65 @@
|
||||
require("core.Library")
|
||||
GLOBAL,sThread=require("multi.intergration.loveManager").init() -- load the love2d version of the lanesManager and requires the entire multi library
|
||||
--IMPORTANT
|
||||
-- Do not make the above local, this is the one difference that the lanesManager does not have
|
||||
-- If these are local the functions will have the upvalues put into them that do not exist on the threaded side
|
||||
-- You will need to ensure that the function does not refer to any upvalues in its code. It will print an error if it does though
|
||||
-- Also each thread has a .1 second delay! This is used to generate a random values for each thread!
|
||||
require("core.GuiManager")
|
||||
gui.ff.Color=Color.Black
|
||||
function multi:newSystemThreadedQueue(name) -- in love2d this will spawn a channel on both ends
|
||||
local c={}
|
||||
c.name=name
|
||||
if love then
|
||||
if love.thread then
|
||||
function c:init()
|
||||
self.chan=love.thread.getChannel(self.name)
|
||||
function self:push(v)
|
||||
self.chan:push(v)
|
||||
end
|
||||
function self:pop()
|
||||
return self.chan:pop()
|
||||
end
|
||||
GLOBAL[self.name]=self
|
||||
return self
|
||||
end
|
||||
return c
|
||||
else
|
||||
error("Make sure you required the love.thread module!")
|
||||
end
|
||||
else
|
||||
c.linda=lanes.linda()
|
||||
function c:push(v)
|
||||
self.linda:send("Q",v)
|
||||
end
|
||||
function c:pop()
|
||||
return ({self.linda:receive(0,"Q")})[2]
|
||||
end
|
||||
function c:init()
|
||||
return self
|
||||
end
|
||||
GLOBAL[name]=c
|
||||
end
|
||||
return c
|
||||
end
|
||||
queue=multi:newSystemThreadedQueue("QUEUE"):init()
|
||||
queue:push("This is a test")
|
||||
queue:push("This is a test2")
|
||||
queue:push("This is a test3")
|
||||
queue:push("This is a test4")
|
||||
multi:newSystemThread("test2",function()
|
||||
queue=sThread.waitFor("QUEUE"):init()
|
||||
data=queue:pop()
|
||||
while data do
|
||||
print(data)
|
||||
data=queue:pop()
|
||||
end
|
||||
queue:push("DONE!")
|
||||
end)
|
||||
multi:newThread("test!",function()
|
||||
thread.hold(function() return queue:pop() end)
|
||||
t.text="Done!"
|
||||
end)
|
||||
t=gui:newTextLabel("no done yet!",0,0,300,100)
|
||||
t:centerX()
|
||||
t:centerY()
|
||||
@@ -0,0 +1,37 @@
|
||||
require("core.Library")
|
||||
GLOBAL,sThread=require("multi.intergration.loveManager").init() -- load the love2d version of the lanesManager and requires the entire multi library
|
||||
--IMPORTANT
|
||||
-- Do not make the above local, this is the one difference that the lanesManager does not have
|
||||
-- If these are local the functions will have the upvalues put into them that do not exist on the threaded side
|
||||
-- You will need to ensure that the function does not refer to any upvalues in its code. It will print an error if it does though
|
||||
-- Also each thread has a .1 second delay! This is used to generate a random values for each thread!
|
||||
require("core.GuiManager")
|
||||
gui.ff.Color=Color.Black
|
||||
queue=multi:newSystemThreadedQueue("QUEUE"):init()
|
||||
queue:push(1)
|
||||
queue:push(2)
|
||||
queue:push(3)
|
||||
queue:push(4)
|
||||
queue:push(5)
|
||||
queue:push(6)
|
||||
multi:newSystemThread("STHREAD_1",function()
|
||||
queue=sThread.waitFor("QUEUE"):init()
|
||||
GLOBAL["QUEUE"]=nil
|
||||
data=queue:pop()
|
||||
while data do
|
||||
print(data)
|
||||
data=queue:pop()
|
||||
end
|
||||
end)
|
||||
multi:newThread("THREAD_1",function()
|
||||
while true do
|
||||
if GLOBAL["QUEUE"]==nil then
|
||||
t.text="Deleted a Global!"
|
||||
break
|
||||
end
|
||||
thread.skip() -- give cpu time to other processes
|
||||
end
|
||||
end)
|
||||
t=gui:newTextLabel("no done yet!",0,0,300,100)
|
||||
t:centerX()
|
||||
t:centerY()
|
||||
Reference in New Issue
Block a user