2013-04-09 8 views
1

매 초마다 30 초 동안 점검을 실행하려고합니다. Ruby를 사용하여이 작업을 수행하는 명확한 방법을 아직 찾지 못했습니다. 이 같은 것을 현재 시도 :특정 시간 간격 동안 또는 조건이 충족되는 동안 루프를 수행하십시오.

until counter == 30 
    sleep 1 
    if condition 
    do something 
    break 
    else 
    counter +=1 
end 

잠깐, 그 트랙에서 스레드를 완전히 멈추게하는 sleep을 사용해야하는 것과 같은 문제가 있습니다. 수면을 사용하지 않고 위와 비슷한 것을 성취 할 수있는 또 다른 방법이 있습니까? 시간 간격에 따라 뭔가 순환하는 방법이 있습니까?

+2

카운터 변수를 없애고 1..30에서 for i 또는 1.upto (30) 또는 (1..30) .each 중 하나를 사용하십시오. – meagar

+1

기다리는 동안 스레드로 무엇을하고 싶습니까? 확인하고 싶다면 [IO # select] (http://www.ruby-doc.org/core-1.9.3/IO.html#method-c-select)와 같은 것을 체크하고 싶을 것입니다. IO가 없으면 다른 작업을 수행하십시오. 위의 코드에서 수행해야 할 다른 처리가 있는지 여부는 분명하지 않습니다. 잠자는 것만으로도 본질적으로 잘못된 것은 없습니다. –

+0

질문이 모호하여 죄송합니다. 이벤트 기반/다중 스레드 기반 이벤트 기반 봇 실행 중입니다. 루프를 트리거 한 이벤트의 30 초 내에 조건이 발생하는지 확인하고 싶었습니다. 그 30 초 이내에 수표를 꽤 자주 (1 초 또는 OS 간격)하고 싶었습니다. 조건은 다른 이벤트에서 업데이트/발생하며이 루프가 발생하고 발생하는 상황을 기반으로 반응을 확인하고 수행하도록합니다. –

답변

4

당신은 당신이이 라인을 따라 뭔가를 찾고있는 대략 수 있습니다

now = Time.now 
counter = 1 
loop do 
    if Time.now < now + counter 
    next 
    else 
    puts "counting another second ..." 
    end 
    counter += 1 
    break if counter > 30 
end 
+0

이 작업은 실제로 내가 수행하려고했던 작업을 성취했다고 생각합니다. 정수 값을 한 번에 더하는 것은 초를 기다리는 것과 같습니다. 감사합니다 –

+2

이것은 CPU를 고정하므로 잠자는 것보다 더 나쁩니다. –

0

당신이 간격을 제어

counter == 30 
interval = 5 # Check every 5 seconds 
interval_timer = 1 # must start at 1 
now = Time.now 
while Time.now - now < counter 
    if interval_timer % interval == 0 #Every 5 attempts the activity will process 
     if condition 
      stuff 
     end 
    end 
    process_timer = process_timer + 1 
end 

이 보장 30초에서 일어날 수 있습니다 이것을 시도 할 수 있습니다 간격은 1 이상의 값으로 설정할 수 있습니다. 어떤 것들은 밀리 세컨드 단위로 처리되기 때문에 처리 과정을 줄일 수있는 옵션을 제공합니다. 그래픽 처리에서 잘 작동합니다.