【问题标题】:How do I run multiple functions until one returns?如何运行多个函数直到一个函数返回?
【发布时间】:2015-12-17 04:05:00
【问题描述】:

我有两个无限循环(while true do),我需要程序在其中一个函数返回某些内容后继续运行。但是当第一个函数返回时,第二个函数仍在运行。 我如何使用 lua 中的协程来做到这一点?

【问题讨论】:

  • 那么,无限循环中有函数,还是您正在等待其中一个无限循环中断,以便另一个可以中断?
  • 我有两个函数,每个函数都包含一个无限循环。我想同时运行它们,并且当其中一个功能中断时程序继续运行。

标签: lua coroutine


【解决方案1】:

首先,它们不会“同时运行”——Lua(以及几乎大多数其他“多任务”系统)总是只运行一段代码。所以你的无限“管理器”循环将调用第一个协程,等到它产生或结束,然后调用第二个,等待它,然后恢复第一个并继续这个过程直到结束。

在您的两个协程中规划逻辑,以便它们根据您的任务不时地定期yield,并在合理的时间段内。当其中一个成功结束时,您只需放弃另一个而不恢复。

【讨论】:

    【解决方案2】:

    正如 Oleg 所说,它们实际上并没有立即运行。他们只是轮流奔跑。

    我相信您正在寻找这样的东西(?):

    active = true
    coroutine.resume(coroutine.create(function()
            while active do
                print("Hello")
                if (condition) then
                    active = false --Since the loops only run if active is true, this effectively breaks both loops
                    break
                end
            coroutine.yield()
            end
    end))
    
        active = true
    coroutine.resume(coroutine.create(function()
            while active do
                print("Hi!")
                if (condition) then
                    active = false --Since the loops only run if active is true, this effectively breaks both loops
                    break
                end
            coroutine.yield()
            end
    end))
    

    这里发生了什么:我们将控制从一个线程切换到另一个线程,每次允许 1 个循环,并且我们在 active 为 true 时运行而不是 while true。因此,通过在循环中将 active 设置为 false,我们也可以中断另一个循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 2021-12-21
      • 2017-02-28
      • 2018-07-16
      • 1970-01-01
      相关资源
      最近更新 更多