2012-04-21 27 views
12

Tôi có một tập lệnh Ruby thực hiện một số công việc dài. Đó là dòng lệnh duy nhất và tôi muốn cho thấy rằng tập lệnh vẫn đang chạy và không bị tạm dừng. Tôi đã từng thích cái gọi là "con trỏ quay" trong những ngày cũ và tôi đã tái tạo nó trong Ruby dưới Windows.In một "con trỏ" ASCII đang quay trong bảng điều khiển

Câu hỏi: tính năng này có hoạt động trong hệ điều hành khác không? Nếu không, có cách nào độc lập với hệ điều hành để thực hiện việc này không?

Không có giải pháp IRB nào.

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

Nó sẽ làm việc trên tất cả các HĐH quan trọng tôi biết, trừ khi các nhân vật in xảy ra với gây ra một ngắt dòng. –

+1

Hoạt động trên Linux, Ruby 1.8.7 ... –

+8

Bằng cách này, điều này tương đương với '('/ - \\ |' * 10) .each {| c | in c; ngủ (0,1); in "\ b"} ' –

Trả lời

34

Có, tính năng này hoạt động trên Windows, OS X và Linux. Cải thiện về đề nghị Niklas', bạn có thể làm cho này tổng quát hơn như vậy:

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) 

Nếu bạn không biết quá trình này sẽ mất bao lâu, bạn có thể làm điều này trong một thread:

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!" 

Cái này kết quả đầu ra:

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

wow Phrogz, điều này thật đẹp, giải quyết mọi thứ việc thực hiện. Điều gì về tuyên bố của bạn nó hoạt động trên WOL, bạn có thể kiểm tra nó? bạn có máy ảo hay làm thế nào dit bạn kiểm tra nó? – peter

+0

@peter Bạn đã thử nghiệm trên Windows; Tôi đã thử nghiệm trên OS X và Ubuntu. – Phrogz

+0

@peter Lưu ý rằng tôi đã cập nhật mã chuỗi được đơn giản hơn và sạch hơ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 

EDIT từ peter: đây là một phiên bản làm việc

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

spin_it 10 
+1

thnx cho sự đóng góp của bạn Jason, nhưng có bạn thử nghiệm? nó không hoạt động trên ruby193 trên W7 – peter

+1

khiến nó hoạt động, tiếp tục đăng !! – peter

+1

'Array # rotate!' Là tiện lợi – Julik

3

Tôi đã viết một viên đá quý spin_to_win hiển thị một spinner trong khi tạo ra một khối. Ví dụ:

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

Nó cũng có thể theo dõi công việc đang chờ vs công việc hoàn thành:

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!] 
+0

Thnx, tôi đã thử các ví dụ của bạn sau khi cài đặt đá quý của bạn (không có lỗi ở đó) nhưng gặp lỗi trên cả hai (tôi đang dùng win7, MRI Ruby 1.9.3) C:/.. /console/spin_to_win1.rb:8: lỗi cú pháp, không mong muốn $ undefined, mong $ end Zzzz \ [buồn ngủ] ^ – peter

+0

Ah, nên làm rõ phần cuối cùng là đầu ra của spinner. – mguymon

Các vấn đề liên quan