2012-10-13 2 views
0
time_limit = gets.to_f * 60 
start_time = Time.new 
end_time = start_time + time_limit 
x = 1 
until Time.new >= end_time 
    time_left = end_time - Time.new 
    time_left_in_minutes = time_left/60 
    puts "Minutes Left: #{time_left_in_minutes}" 
end 
until x == 0 
puts "Time Since End of #{time_limit/60} Minutes: #{Time.new - end_time}" 
end 

내 컴퓨터 팬이 최고 속도로 회전하며 내 컴퓨터가이 코드를 실행하면 소리가납니다. 이 작업을 수행하는 더 좋은 방법은 프로세서의 많은 작업이 아닌가?루비 용 타이머 코드가 왜 그렇게 어렵습니까?

답변

2

프로세서에 많은 작업을 요청하고 있기 때문에 이러한 현상이 발생합니다. 루프에서

봐 : 단지 회전하고 회전 및 시간 제한에 도달 할 때까지 회전

until Time.new >= end_time 
    time_left = end_time - Time.new 
    time_left_in_minutes = time_left/60 
    puts "Minutes Left: #{time_left_in_minutes}" 
end 

. 프로세서가 계속 가고 있습니다. (여기에서는 값 비싼 물건도 있습니다. 반복 할 때마다 Time.new을 두 번 호출하면 오브젝트 생성이 비쌀 수 있습니다. 그러나 루프가 빨라지면 더 빨리 회전 할 수 있습니다.)

루프에 지연을 추가하여 초당 1 회 또는 1 분에 1 회만 실행되도록합니다. sleep 30은 30 초 동안 일시 중지됩니다.

2

시간 초과를 기다리는 동안 바쁘게 돌아 다니기 때문에 컴퓨터가 뜨거워집니다.

가장 쉬운 해결책 : 루프에 sleep (1)을 추가하십시오. 이로 인해 가능한 한 초당 1 회 실행됩니다.

대신에 정확한 시간 (초)을 잠자 게 할 수도 있습니다.

그런 다음 특정 시간 동안 대기 한 후에도 x가 어떤 식 으로든 0이 될 때까지 busy-loop가됩니다. 그러면 CPU도 많이 사용됩니다.

관련 문제