159 lines
3.7 KiB
Lua
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)
|