2012-04-21 20 views
12

Uzun süren işler yapan bir Ruby komut dosyası var. Sadece komut satırı ve komut dosyasının hala devam ettiğini ve durdurulmadığını göstermek istiyorum. Eski günlerde sözde "dönen imleç" i severdim ve bunu Windows altında Ruby'de yeniden üretmeyi başardım.Konsolda bir ASCII döndürme "imleci" yazdırma

Soru: Bu diğer işletim sistemlerinde çalışıyor mu? Değilse, bunu gerçekleştirmek için işletim sistemi bağımsız bir yolu var mı?

Lütfen IRB çözümleri yok.

10.times { 
    print "/" 
    sleep(0.1) 
    print "\b" 
    print "-" 
    sleep(0.1) 
    print "\b" 
    print "\\" 
    sleep(0.1) 
    print "\b" 
    print "|" 
    sleep(0.1) 
    print "\b" 
} 
+2

baskılı karakterleri gelmiyorsa ben biliyorum hat kesintisine neden olur. –

+1

Linux, Ruby 1.8.7 üzerinde çalışıyor ... –

+8

Bu arada, '('/- \\ | '* 10) .each {| c | baskı c; uyku (0.1); yazdır "\ b"} –

cevap

34

Evet, bu Windows, OS X ve Linux üzerinde çalışır. Niklas' öneri geliştirilmesi, bunu böyle bu daha genel yapabilir:

def show_wait_spinner(fps=10) 
    chars = %w[|/- \\] 
    delay = 1.0/fps 
    iter = 0 
    spinner = Thread.new do 
    while iter do # Keep spinning until told otherwise 
     print chars[(iter+=1) % chars.length] 
     sleep delay 
     print "\b" 
    end 
    end 
    yield.tap{  # After yielding to the block, save the return value 
    iter = false # Tell the thread to exit, cleaning up after itself… 
    spinner.join # …and wait for it to do so. 
    }    # Use the block's return value as the method's 
end 

print "Doing something tricky..." 
show_wait_spinner{ 
    sleep rand(4)+2 # Simulate a task taking an unknown amount of time 
} 
puts "Done!" 

: Eğer süreç ne kadar süreceğini bilmiyorsanız

def show_wait_cursor(seconds,fps=10) 
    chars = %w[|/- \\] 
    delay = 1.0/fps 
    (seconds*fps).round.times{ |i| 
    print chars[i % chars.length] 
    sleep delay 
    print "\b" 
    } 
end 

show_wait_cursor(3) 

, başka iş parçacığı yapabilirsiniz Bu seferki çıkışları: Peter dan

Doing something tricky...| 
Doing something tricky.../ 
Doing something tricky...- 
Doing something tricky...\ 
(et cetera) 
Doing something tricky...done! 
+0

wow Phrogz cevabını vermek için hızlı bir başlangıç ​​yapacağım, bu çok güzel. hayata geçirme. İfadeniz WOL'de çalışıyor, test edebilecek miydiniz? sanal makineleriniz var mı, yoksa nasıl test ettiniz? – peter

+0

@peter Windows'da test ettiniz; OS X ve Ubuntu'da test ettim. – Phrogz

+0

@peter Dişli kodu daha basit ve daha temiz olacak şekilde güncellediğimi unutmayın. – Phrogz

4
# First define your chars 
pinwheel = %w{|/- \\} 

# Rotate and print as often as needed to "spin" 
def spin_it 
    print "\b" + pinwheel.rotate!.first 
end 

DÜZENLEME: burada bir çalışma versiyonu

def spin_it(times) 
    pinwheel = %w{|/- \\} 
    times.times do 
    print "\b" + pinwheel.rotate!.first 
    sleep(0.1) 
    end 
end 

spin_it 10 
+1

thnx var, ama yine de test ettik var mı? W7 – peter

+1

üzerinde ruby193 çalışmıyor, çalışmaya devam! – peter

+1

'Array # rotate!' Nifty – Julik

3

Bir blok verirken bir döndürücü görüntüleyen bir mücevher spin_to_win yazdım. Örneğin:

SpinToWin.with_spinner('Zzzz') do |spinner| 
    spinner.banner('sleepy') 
    sleep 1 
end 
Zzzz \ [sleepy] 

Ayrıca tamamlanan çalışma vs bekleyen çalışmalarını izleyebilirsiniz:

SpinToWin.with_spinner('Zzzz') do |spinner| 
    spinner.increment_todo!(3) 

    spinner.banner('snore') 
    sleep 1 
    spinner.increment_done! 

    spinner.banner('dream') 
    sleep 1 
    spinner.increment_done! 

    spinner.banner('wake up!') 
    sleep 1 
    spinner.increment_done! 
end 
Zzzz \ 3 of 3 [wake up!] 
Tüm önemli işletim sisteminde çalışacak
+0

Thnx, geminizi yükledikten sonra örneklerinizi denedim (orada hata yok) ama her ikisinde de bir hata alıyorum (win7, MRI Ruby 1.9.3 üzerindeyim) C:/.. /console/spin_to_win1.rb:8: sözdizimi hatası, beklenmedik $ undefined, beklemede $ end Zzzz \ [uykulu] ^ – peter

+0

Ah, son parçanın, çıkrının çıktısı olduğunu netleştirmesi gerekir. – mguymon