2015-10-16 6 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% -ного использования ЦП, никакого вывода отображаемого поведения.

Моя вторая попытка:

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

работает уже в течение 3-х часов без вины. Я поставил отладочный вызов трассировки стека, используя debug.traceback() и никогда не получал ответ более одного уровня. Дополнительно, наблюдая за использованием памяти Window для процесса, он не увеличивался в течение 3 часов.

Я доволен, что у меня есть решение, но я все еще несколько недовольны тем, что не понимаю, почему он работает, и почему исходная версия терпит неудачу.

Было указано, что я страдаю от туннельного зрения и что цикл while решит мою проблему.

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

На что я могу только ответить ... duh, конечно.