2015-01-30 24 views
10

Örneğin, bir zamanlayıcı yapmak istiyorsam, döngüde nasıl bir gecikme yapabilirim, bu sayede saniyeler içinde sayılır ve yalnızca bir milisaniye içinde dönmezler mi?Ruby'de bir döngüde gecikme nasıl yapılır?

+0

. http://www.ruby-doc.org/core-2.2.0/Kernel.html#method-i-sleep –

+2

'[5,4,3,2,1] .each {| n | n koyar; Örneğin, uyku 1} 'i her saniyede 5 ila 1 arasında sayılır. Aradığın şey bu mu? –

+0

Önceki yorumlarla aynı fikirdeyim - 'sleep' ile yapay bir gecikme ekleyebilirsiniz. Sadece Float's ve belki de Rational's gibi kesirli değerler sağlayarak saniyeler fraksiyonları için uyuyabileceğinizi ekleyebilirim. –

cevap

20

'açıklama' Yukarıdaki istediler çok basit doğrudan soru verilir Cevabınız şöyledir:

1.upto(5) do |n| 
    puts n 
    sleep 1 # second 
end 

Bu sizin kod kalanını engellemeden, periyodik bir yöntem çalıştırmak istediğiniz olabilir. Bu durumda, (kod iki adet aynı anda aynı veri yapısını değiştirmeye çalışırken değil emin olmak için ve muhtemelen bir muteksi oluşturun) bir iş parçacığı kullanmak istiyorum: Her nasılsa

require 'thread' 

items = [] 
one_at_a_time = Mutex.new 

# Show the values every 5 seconds 
Thread.new do 
    loop do 
    one_at_a_time.synchronize do 
     puts "Items are now: #{items.inspect}" 
     sleep 5 
    end 
    end 
end 

1000.times do 
    one_at_a_time.synchronize do 
    new_items = fetch_items_from_web 
    a.concat(new_items) 
    end 
end 
12

, birçok kişi düşünüyorum argümanı çalışacak şekilde sabit bir zaman aralığına sahip bir sleep yönteminin eklenmesi. Ancak, hiçbir yöntemin sıfır zaman almadığını unutmayın. Bir döngü içinde sleep(1) koyarsanız, döngüde başka içeriğiniz olduğu sürece döngü kesinlikle 1 saniyeden daha fazla olacaktır. Daha da kötüsü, her zaman bir döngünün her yinelemesini işlerken aynı zaman almaz. Her döngü, hata rasgele olarak 1 saniyeden daha uzun sürer. Döngü çalışmaya devam ettikçe, bu hata her zaman pozitif yönde büyüyecek ve büyüyecektir. Özellikle, bir zamanlayıcı istiyorsan, döngünün önemli olduğu yerde, bunu yapmak istemezsin.

sabit belirtilen zaman aralığı ile döngüye doğru yolu böyle yapmak şudur: Sen döngü içinde `uyku 1` 1 saniye uyku olabilir

loop do 
    t = Time.now 
    #... content of the loop 
    sleep(t + 1 - Time.now) 
end 
+0

Hatayı üreten: TypeError: Zaman aralığına dönüştürülemiyor –

+0

Aslında çalışıyor :) –