实现暂停功能并在后继续执行,无需协程

我正在尝试将多任务功能实现到Lua中,以便我可以在Node MCU上使用多线程。

我的想法是将线程运行为函数,将其暂停并继续下一个循环。debug.sethook函数似乎很有前途,但在协程中无法工作,它们只在协程完成后执行挂钩。 我只需要一种暂停功能的方法。

mt = {}
mt.threadList = {}

function mt.newThread(fnc)
    table.insert(mt.threadList,fnc)
end

function mt.update()
    for i=1,#mt.threadList do
        print("EPOCH: "..i)
        debug.sethook(print,"c",40)
        coroutine.resume( mt.threadList[i] )
        debug.sethook()
    end
end

function tA()
    for i=1,100 do
        print("A",i)
    end
end

function tB()
    for i=1,100 do
      print("B",i)
    end
end

mt.newThread(tA)
mt.newThread(tB)

mt.update()
点赞
用户734069
用户734069

coroutine.resume 继续一个协同程序,而不是一个常规函数。协同程序(从 Lua 方面)是由 coroutine.create 生成的。coroutine.resume 只能在由 coroutine.create 返回的值上调用。

话虽如此,Lua 协同程序是协作的(因此称为“协同程序”)。这意味着您不能任意在任何特定点中断它们的执行。协程本身应该通过调用 coroutine.yield 或类似的函数来决定何时暂停。

您可以在协程上使用 debug.sethook 来设置其调试钩子(如果您不将协程传递给 sethook,则它假定您设置了调试钩子用于“当前”线程,这不是您想要的),从而在任意时间点处使用 coroutine.yield。但您确实不应该这样做。

无论如何,如果没有协程,则根本无法“暂停”函数的执行。即使有调试钩子也不行。

2019-09-10 22:51:38