Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

How to stop a coroutine? {Unanswered}

Asked by
RedCombee 585 Moderation Voter
9 years ago

I looked for a specific coroutine function that would stop a coroutine, but I couldn't find one. Is there a legitimate way to pause or delete a coroutine?

3 answers

Log in to vote
0
Answered by 9 years ago

I don't believe there is a function to stop a co-routine. The only way to stop one is to disable the script (this may not work, I haven't tried it), let it finish, or make an error.

Example:

local forceQuit = 0

coroutine.wrap(function()
    while forceQuit==0 do
        wait()
        print('Coroutine running')
    end
    print('Coroutine finished.')
end)()
wait(5)
forceQuit=1

This should stop it in 5 seconds. You can also make it have an error.

local forceQuit = 0

coroutine.wrap(function()
    while wait() do
        print('Coroutine running')
        if forceQuit==1 then error('Coroutine errored') end
    end
    print('Coroutine finished.')
end)()
wait(5)
forceQuit=1

-- Edit -- I've just read your other question, if there is a way to pause one. There is, but it's not a built-in roblox function.

This will pause it 5 times for 3 seconds (or 4 times, I get confused, but you get how it works.)

local pause=false

coroutine.wrap(function()
    while wait() do
        print('coroutine running')
        if pause==true then
            while pause==true do wait() end 
        end
    end
end)()

for i = 1, 5 do
    wait(5)
    pause=true
    wait(3)
    pause=false
end
Ad
Log in to vote
0
Answered by
Redbullusa 1580 Moderation Voter
9 years ago

There is a way to 'pause', or suspend a coroutine, and that is done by the 'yield()' method.

EXAMPLE FROM WIKI

new_thread=coroutine.wrap(function(param)
    print(param)
    local resumedWith = coroutine.yield()
    print("Resumed with: " .. resumedWith)
end) 
new_thread("Hola mis amigos!")
new_thread("This was retrieved with yield()")

From what I understand, the new_thread coroutine will print the 'param' argument and then suspend it. It is then called by the "Hola mis amigos!" string. If it is called on again, it will print "Resumed with: This was retrieved with yield()".

For more information on coroutines, visit here and its links.

Sorry for the short answer and the lack of dense explanation. I tried many examples, but they do not seem to work as expected after I've tested them. Originally, I thought I had an answer until a plethora of errors had hit me and left me uncertain.

I'm apparently very inexperienced with coroutines, but once I know more about them, I'll check back here.

Log in to vote
-1
Answered by
aalok 20
9 years ago

An effective way to stop a coroutine (and the only way I know) is to stop the thread it is looping through, by either an error or a change.

An example of this is here:

coroutine.create(coroutine.resume(function() --would rather use spawn(function() but oh
    print('val!')
    priint('val!)
end)

I also prefer using spawn(function()as it is faster and neater.

Answer this question