2014-04-17 1 views
2

요약 : busywaiting하지 않고도 스크립트에 시간이 흐를 수 있습니까? os.execute('sleep 1')을 사용하면 절단되지 않고 시간이 낭비됩니다.루아에서 os.clock() 증가시키기

세부
나는 특정 간격 후 작업을 수행 a library 있습니다. 나는 현재 테이블을 시간순으로 정렬 된 목록에 삽입하여이 작업을 예약합니다. 대략 :

local delayedWork = {} 
function handleLater(data, delaySeconds) 
    local delayedItem = { data=data, execTime=os.clock() + delaySeconds } 
    local i=1 
    for _,existing in ipairs(delayedWork) do 
    if existing.execTime > delayedItem.execTime then break else i=i+1 end 
    end 
    table.insert(delayedWork,i,delayedItem) 
end 

나중에 정기적으로 작업을 확인합니다. 대략 :

function processDelayedWork() 
    local i,last = 1,#delayedWork 
    while i<=last do 
    local delayedItem = delayedWork[i] 
    if delayedItem.execTime <= os.clock() then 
     table.remove(delayedWork,i) 
     -- use delayedItem.data 
     last = last-1 
    else 
     i=i+1 
    end 
    end 
end 

(이 벽 시간 대신 CPU 시간을 사용한다는 사실이 다른 문제에 대한 문제이다 I 반복 압축 패스 처리를 대신 한 동안 어레이를 이동한다는 사실은 최적화 관계 없다. 여기를 클릭하십시오.)

시스템의 단위 테스트를 실행할 때 시간이 지체 될 필요가 있습니다. 그러나 os.execute('sleep 1')을 호출하면 초당 벽시계가 소비되지만 os.clock()은 증가하지 않습니다. 통과

$ lua -e "require 'os' print(os.time()) os.execute('sleep 0.4') print(os.time())" 
1397704209 
1397704209 

내가 시간을 강제 할 수이는 정수 초 (그리고 숫자 float 대신 double를 사용하여 컴파일 된 시스템보다 작은) 때문에 나는 os.time()을 사용할 수 없습니다

$ lua -e "require 'os' print(os.clock()) os.execute('sleep 1') print(os.clock())" 
0.002493 
0.002799 

그냥 바쁜 기다림없이 내 대본에?

답변

1

왜 당신이 원하는 시계 기능을 작성하지 않습니까?

do 
    local clock = os.clock 
    local increment = 0 
    os.clock = function(inc) 
    increment = increment + (inc or 0) 
    return clock()+increment 
    end 
end 
print(os.clock()) 
os.clock(1) 
print(os.clock()) 

이렇게하면 0.001 1.001 또는 이와 비슷한 내용이 인쇄됩니다.

+0

단위 테스트를 좀 더 쉽게하기 위해 런타임을 수정하는 데 이상한 것 같습니다. 더 좋은 해결책이 없다는 것이 너무 나쁘다.하지만이 좋은 아이디어를 받아 들인다. – Phrogz

2

폴이 이미 대답했습니다. make os.clock은 필요한 것을 반환합니다.

난 당신이 얼마나 빨리 시간 것은 os.clock \\\\\\\\\\\\\\\\\\\\\\\에 따라 전달 제어 할 수 있습니다 구현을 추가 해요.

do 
    local realclock = os.clock 
    local lasttime = realclock() 
    local faketime = lasttime 
    local clockMultiplier = 1 
    function setClockMultiplier(multiplier) 
     clockMultiplier = multiplier 
    end 
    function adjustTime(offsetAmount) 
     faketime = faketime + offsetAmount 
    end 
    function os.clock() 
     local now = realclock() 
     adjustTime((now - lasttime) * clockMultiplier) 
     lasttime = now 
     return faketime 
    end 
end 

이제 자유롭게 느려지거나 os.clock에 의해보고 된 시간의 흐름 속도를 setClockMultiplier를 호출 할 수 있습니다. adjustTime으로 전화하면 시계를 임의의 양만큼 앞당기거나 늦출 수 있습니다.

+0

_ "시간 낭비가 아닌가?" 나는 5 초가 지나가고 그 시점부터 계속 수행 할 수있는 스크립트 _think_를 가질 수 있다면 모든 단위 테스트가 완료 될 때까지 5 초를 기다리지 않는 것을 선호합니다. – Phrogz