Ryan cf22651949 Added intergration loveManager
Adds multi.intergrations.loveManager,lua
Created an example file for you to look at
2017-06-24 22:46:44 -04:00

159 lines
3.7 KiB
Lua

Thread={}
Thread.ChannelT1 = love.thread.getChannel("Easy1")
Thread.ChannelT2 = love.thread.getChannel("Easy2")
Thread.ChannelT3 = love.thread.getChannel("Easy3")
Thread.ChannelT4 = love.thread.getChannel("Easy4")
Thread.ChannelMain = love.thread.getChannel("EasyMain")
Thread.Name = "Thread Main"
Thread.n=0
Thread.count=1
function Thread:packTable(G)
function escapeStr(str)
local temp=""
for i=1,#str do
temp=temp.."\\"..string.byte(string.sub(str,i,i))
end
return temp
end
function ToStr(t)
local dat="{"
for i,v in pairs(t) do
if type(i)=="number" then
i="["..i.."]="
else
i=i.."="
end
if type(v)=="string" then
dat=dat..i.."\""..v.."\","
elseif type(v)=="number" then
dat=dat..i..v..","
elseif type(v)=="boolean" then
dat=dat..i..tostring(v)..","
elseif type(v)=="table" and not(G==v) then
dat=dat..i..bin.ToStr(v)..","
--elseif type(v)=="table" and G==v then
-- dat=dat..i.."assert(loadstring(\"return self\")),"
elseif type(v)=="function" then
dat=dat..i.."assert(loadstring(\""..escapeStr(string.dump(v)).."\")),"
end
end
return string.sub(dat,1,-2).."}"
end
return ToStr(G)
end
Thread.last={}
function Thread:GetStatus()
print(self.n.." Threads Exist!!!")
for i=1,self.n do
print("\tThread "..i.." Running: "..tostring(self["Thread"..i]:isRunning()))
if not(self["Thread"..i]:isRunning()) then
print("\t\t"..self["Thread"..i]:getError())
end
end
end
function Thread:Start(n)
local x=love.system.getProcessorCount()
if x>1 then
x=x-1
else
x=1
end
n=n or x
if n<1 then
print("Must be atleast 1 thread running!!!")
return
end
if n>4 then
print("Must be no more than 4 threads running!!!")
return
end
for i=1,n do
self["Thread"..i]=love.thread.newThread("Libs/T"..i..".lua")
self["Thread"..i]:start()
end
Thread.n=n
end
function Thread:RestartBroken()
for i=1,self.n do
if self["Thread"..i]:isRunning()==false then
self["Thread"..i]:start()
end
Thread:Boost(Thread.last[1],Thread.last[2])
end
end
function Thread:Send(name,var,arg3)
if self.n>0 then
if type(var)=="table" then
var=Thread:packTable(var)
arg3=name
name="table"
end
self["ChannelT"..((self.count-1)%self.n)+1]:push({name,var,arg3})
self.count=self.count+1
end
end
function Thread:SendAll(name,var,arg3)
if self.n>0 then
for i=1,self.n do
if type(var)=="table" then
var=Thread:packTable(var)
arg3=name
name="table"
end
self["ChannelT"..i]:push({name,var,arg3})
end
end
end
function Thread:UnPackChannel()
local c=self.ChannelMain:getCount()
for i=1,c do
local temp=self.ChannelMain:pop()
if temp[3]=="table" then
_G[temp[1]]=assert(loadstring(temp[2]))()
else
if Thread.OnDataRecieved then
Thread.OnDataRecieved(temp[1],temp[2],temp[3])
end
_G[temp[1]]=temp[2]
end
end
end
function Thread:Boost(func,name)
if Thread.last[1]==nil then
return
end
Thread.last={func,name}
name=name or "nil"
if self.n>0 then
self:Send("func",string.dump(func),name)
end
end
function Thread:SendLibs(func,name)
name=name or "nil"
if self.n>0 then
self:SendAll("func",string.dump(func),name)
end
end
function Thread.mainloop()
if Thread.n>0 then
Thread:UnPackChannel()
end
end
Thread.MainThread=true
local loop = multi:newLoop()
loop:OnLoop(Thread.mainloop)
OnThreadError=multi:newConnection()
function love.threaderror(thread, errorstr)
Thread:GetStatus()
Thread:RestartBroken()
Thread:GetStatus()
OnThreadError:Fire(thread,errorstr)
end
multi:newTask(function()
math.randomseed(math.floor(os.time()/2))
for i=1,Thread.n do
Thread["ChannelT"..i]:push({"randseed",math.random(-1000000,1000000)})
Thread["ChannelT"..i]:push({"func",string.dump(function() math.randomseed(randseed) end),"randomizing"})
end
end)