Threading is an integral part of programming. From loading assets while playing the game, or running a game loop for a FPS, threading can be used in many cases.
Threading is where you create a thread which can be used to run code without stopping the entire script. You can easily create a thread in RBLX Lua by doing
spawn(function()
-- code
end)
This, in itself wouldn't do anything. However, if you put a while loop inside of the spawn, you can run code before and AFTER the while loop is set. For example,
print("Hello world!") -- prints
spawn(function()
while wait() do
-- i am of the code variety
end
end)
print("Hello world!") -- still prints
What if, instead of making a thread and running the code inside it instantly, you wanted to run the code after a delay? Well, RBLX Lua provides just that. The delay function creates a thread, then after x amount of time, runs the thread.
delay(3, function()
print("world!") -- prints after 3 seconds
end)
print("Hello") -- prints instantly
In vanilla Lua, creating a thread is harder (or in my opinion, easier!), but still works in the same fundamental way. You can create a thread by doing
local Thread = coroutine.create(function()
print("Hello world!")
wait(3)
print("I like spaghetti!")
end)
and run it by doing
coroutine.resume(Thread) -- prints "Hello world!" and "I like spaghetti" without yielding the rest of the script.
You can also easily create a thread and run it by doing
local ThreadFunction = coroutine.wrap(function()
print("Hello world!")
wait(1)
print("I am 1 second!")
end) -- creates a new function that starts the thread
ThreadFunction() -- runs the thread
What if theres a loop inside the thread, and we want to stop when a condition is met, and only continue when we resume the thread? Well, you can call
local ThreadFunction = corountine.wrap(function()
for i = 1, 10 do
print(i .. " bottle of water on the wall!")
coroutine.yield()
end
end)
ThreadFunction() -- only prints "1 bottle of water on the wall!"
ThreadFunction() -- prints "2 bottle of water on the wall"