2015-10-16 66 views
2

我已經瀏覽了lua-users Sleep Function以努力找到一個非繁忙的等待睡眠問題的解決方案,我對他們中的任何人都不滿意。儘管如此,我試圖用幾個在使用尾調用的函數的末尾提供延遲。爲什麼我的尾巴調用函數不會暫停並刷新輸出?

通常我不會使用尾部呼叫,但由於lua沒有爲尾部呼叫留下堆棧,所以適合我。

不幸的是,我看到我的處理器峯值約20%的使用,並且程序一旦開始就沒有任何輸出沖洗,就立即無響應。

問題(簡體)看起來是這樣的:

function myFunc() 
    -- do some stuff 
    -- lots of snazzy logic and function calls 
    -- heck, throw in a few prints 
    print "Going to sleep" 
    -- sleep for a bit 
    os.execute("sleep 10") 
    print "Waking up" 
    -- tail call 
    return myFunc() 
end 

我已經試過插座選擇方法,os.execute,當然忙等待。其中只有忙碌的等待纔會產生預期的行爲。

這些其他非繁忙的等待解決方案是否也是非阻塞的?那是不是他們允許拖尾呼叫被處理,儘管拖延?

如何刷新輸出並讓該功能等待10秒後才能恢復而不需要等待?

+1

這不是尾巴呼叫。你需要'返回myfunc()'。 –

+0

我不確定我完全理解這裏的目標。這裏的目標是什麼?有什麼問題? –

+0

@EtanReisner它是一個運行24-7的腳本的控制循環。 – Stephen

回答

0

On the advice of Nick Gammon我試過了他的wait.lua解決方案。我最初的嘗試:

function controlLoop() 
    wait.make (
     function() 
     world.Note("Hello world.") -- essentially print 
     wait.time(10) 
    end 
    ) 
    world.Note("Goodbye world.") -- essentially print 
    return controlLoop() 
end 

從完全相同的100%CPU使用,沒有輸出顯示行爲。

我的第二次嘗試:

function controlLoop() 
    wait.make (
     function() 
     world.Note("Hello world.") 
     wait.time(10) 
     world.Note("Goodbye world.") 
     return controlLoop() 
     end 
    ) 
end 

已經運行3小時無故障。我確實使用debug.traceback()對堆棧跟蹤進行了調試調用,並且從未得到超過1級深度的響應。此外,觀看窗口內存使用的過程中,3小時內沒有增加。

我很高興我有一個解決方案,但我仍然有點不高興,我不明白爲什麼它工作,爲什麼原始版本失敗。

有人指出我患有隧道視覺,而且一段時間循環會解決我的問題。

function controlLoop() 
    wait.make (
     function() 
     while true do 
      world.Note("Hello world.") 
      wait.time(10) 
      world.Note("Goodbye world.") 
     end -- loop 
     end 
    ) 
end 

我只能回覆......呃,當然。

相關問題