Skip to content
This repository has been archived by the owner on Jul 28, 2022. It is now read-only.

Commit

Permalink
Merge pull request #122 from Sleitnick/use_thread
Browse files Browse the repository at this point in the history
Use thread
  • Loading branch information
Sleitnick authored Jan 6, 2020
2 parents 1d8a2e0 + a1576c4 commit 5ea342b
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 60 deletions.
49 changes: 0 additions & 49 deletions src/ReplicatedStorage/Aero/Internal/FastSpawn.lua

This file was deleted.

34 changes: 33 additions & 1 deletion src/ReplicatedStorage/Aero/Shared/Thread.lua
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,18 @@
so the delay can be cancelled by disconnecting
the returned connection.
DelayRepeat(Number intervalTime, Function func, Arguments...)
> The same as Thread.Delay, except it repeats
indefinitely.
> Returns the Heartbeat connection, thus the
repeated delay can be stopped by disconnecting
the returned connection.
> Properly bound to the time interval, thus will
not experience drift.
Examples:
Expand All @@ -59,6 +71,12 @@
end)
delayConnection:Disconnect()
local repeatConnection = Thread.DelayRepeat(1, function()
print("Hello again", tick())
end)
wait(5)
repeatConnection:Disconnect()
Why:
Expand All @@ -78,7 +96,7 @@
Credit:
evaera & buildthomas: https://devforum.roblox.com/t/coroutines-v-s-spawn-which-one-should-i-use/368966
Quenty: FastSpawn method using BindableEvent
Quenty: FastSpawn (AKA SpawnNow) method using BindableEvent
--]]

Expand Down Expand Up @@ -129,4 +147,18 @@ function Thread.Delay(waitTime, func, ...)
end


function Thread.DelayRepeat(intervalTime, func, ...)
local args = {...}
local nextExecuteTime = (tick() + intervalTime)
local hb
hb = heartbeat:Connect(function()
if (tick() >= nextExecuteTime) then
nextExecuteTime = (tick() + intervalTime)
func(table.unpack(args))
end
end)
return hb
end


return Thread
9 changes: 4 additions & 5 deletions src/ServerScriptService/Aero/Internal/AeroServer.server.lua
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,14 @@ local mt = {__index = AeroServer}
local servicesFolder = game:GetService("ServerStorage").Aero.Services
local modulesFolder = game:GetService("ServerStorage").Aero.Modules
local sharedFolder = game:GetService("ReplicatedStorage").Aero.Shared
local internalFolder = game:GetService("ReplicatedStorage").Aero.Internal

local remoteServices = Instance.new("Folder")
remoteServices.Name = "AeroRemoteServices"

local players = {}
local modulesAwaitingStart = {}

local FastSpawn = require(internalFolder.FastSpawn)
local SpawnNow = require(sharedFolder.Thread:Clone()).SpawnNow

local function PreventEventRegister()
error("Cannot register event after Init method")
Expand Down Expand Up @@ -117,7 +116,7 @@ function AeroServer:WrapModule(tbl)
if (modulesAwaitingStart) then
modulesAwaitingStart[#modulesAwaitingStart + 1] = tbl
else
FastSpawn(tbl.Start, tbl)
SpawnNow(tbl.Start, tbl)
end
end
end
Expand Down Expand Up @@ -196,7 +195,7 @@ local function StartService(service)

-- Start services on separate threads:
if (type(service.Start) == "function") then
FastSpawn(service.Start, service)
SpawnNow(service.Start, service)
end

end
Expand Down Expand Up @@ -289,7 +288,7 @@ local function Init()
-- Start modules that were already loaded:
local function StartLoadedModules()
for _,tbl in pairs(modulesAwaitingStart) do
FastSpawn(tbl.Start, tbl)
SpawnNow(tbl.Start, tbl)
end
modulesAwaitingStart = nil
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,10 @@ local mt = {__index = Aero}
local controllersFolder = script.Parent.Parent:WaitForChild("Controllers")
local modulesFolder = script.Parent.Parent:WaitForChild("Modules")
local sharedFolder = game:GetService("ReplicatedStorage"):WaitForChild("Aero"):WaitForChild("Shared")
local internalFolder = game:GetService("ReplicatedStorage").Aero:WaitForChild("Internal")

local modulesAwaitingStart = {}

local FastSpawn = require(internalFolder:WaitForChild("FastSpawn"))
local SpawnNow = require(sharedFolder:WaitForChild("Thread"):Clone()).SpawnNow

local function PreventEventRegister()
error("Cannot register event after Init method")
Expand Down Expand Up @@ -61,7 +60,7 @@ function Aero:WrapModule(tbl)
if (modulesAwaitingStart) then
modulesAwaitingStart[#modulesAwaitingStart + 1] = tbl
else
FastSpawn(tbl.Start, tbl)
SpawnNow(tbl.Start, tbl)
end
end
end
Expand Down Expand Up @@ -149,7 +148,7 @@ end
local function StartController(controller)
-- Start controllers on separate threads:
if (type(controller.Start) == "function") then
FastSpawn(controller.Start, controller)
SpawnNow(controller.Start, controller)
end
end

Expand Down Expand Up @@ -209,7 +208,7 @@ local function Init()
-- Start modules that were already loaded:
local function StartLoadedModules()
for _,tbl in pairs(modulesAwaitingStart) do
FastSpawn(tbl.Start, tbl)
SpawnNow(tbl.Start, tbl)
end
modulesAwaitingStart = nil
end
Expand Down

0 comments on commit 5ea342b

Please sign in to comment.