OOP coroutine module help

[OOP] coroutine module help:

  1. What do I want to achieve?

A: I need someway to run a loop within a coroutine, which yields for a set parameter of seconds and can be stopped by changing a ‘active’ variable. The ‘active’ variable will be changed via a class method thread:Run(), thread:Stop().

  1. What is the issue?

A: I can’t figure out how to make this work, I debated using: coroutine.wrap(self.func)(...) within a while wait() do to run a function continuously at the same time using a coroutine.

“What would be the most efficient way to do this with coroutines?”

I have created some starter OOP code in a ‘thread’ class here:

local thread = {}
thread.__index = thread
thread.tasks = {}

local coroutine = coroutine

-- Code:

function thread.new(foo, i) --> thread:
    local self = setmetatable({}, thread)
    self.func = foo
    self.interval = i or 0.5;
    self.active = true
    self.Thread = function(...)
        if self.func then
            -- (Somehow) with coroutine
            -- Create thread here with interval of self.interval
            -- Possibly coroutine.yeild? task.wait() or wait()?

    function self:Run()
        self.active = true
        return self
    function self:Stop()
        self.active = false
        return self
    return self

return thread



Man first of all that OOP thing sounds like POOP or POO backwards, Anyways im not very experienced with this whole coroutine thing but from what I can see you are trying to make your module put to sleep a thread and make it so if that variable thing changes it unyields it right? May I ask what are you using this module for?

I would use RunService.Heartbeat and keep track of the elapsed time to create an interval, which you can just :Disconnect at any time to stop it, and its also accurate as it gives you the delta time.

An example:

local t = 0 -- the elapsed time
local connection = RunService.Heartbeat:Connect(function(dt)
  -- increase the `t` variable by dt
  -- which is the seconds elapsed since
  -- the last Heartbeat
  t += dt
  if t < 5 then
    return -- stop the function if 5 seconds haven't elapsed yet
  t = 0 -- reset the timer


-- to stop it

If you want to do this within a loop instead, just pass a condition to your while loop

while active do
1 Like

OOP stands for object oriented programming or a class based over a procedural one. Similar to a language like java, but for lua’s case we use something called ‘metatables’

example: Dog.new() → creates a new dog object

In this case, Thread.new() → needs to create a ‘thread’ object thats created by coroutine.wrap or coroutine.create.

I want my thread object to operate like this, somehow theres a loop within a coroutine wrap that automaticly kills the thread if I change my active variable.

I’m using this module to thread a ‘behavior’ function. This will control a NPCS pathfinding and logical behavior. I’m using a ‘thread’ or coroutine because these npcs will need to be executing the function at the same time. I’m trying to avoid using spawn(). thanks