2013-05-03 45 views
1

所以我在Ruby中工作,想法是不斷重新打印一組字符串,直到按下一個鍵。這是我對於在等待輸入的同時在Ruby線程中打印會生成奇怪的輸出

frame = 
"aaaa 
bbbb 
cccc 
dddd" 

thread = Thread.new do 
    while(true) 
     print frame 
     sleep(0.5) 
    end 

end 

thread.run 

begin 
    system("stty raw -echo") 
    str = STDIN.getc 
ensure 
    system("stty -raw echo") 
end 

thread.kill 

代碼當此代碼執行時,它的輸出

aaaa 
bbbb 
cccc 
ddddaaaa 
     bbbb 
      cccc 
       ddddaaaa 
         bbbb 
          cccc 
           ddddaaaa 
             bbbb 
              cccc 
               ddddaaaa 
                 bbbb 
                  cccc 
                   dddd 

顯然,你會認爲它應該產生

aaaa 
bbbb 
cccc 
dddd 

重複,直到關鍵是按下,我不明白爲什麼它不。思考?

+0

我強烈懷疑你可以削減一個簡單的例子。此外,爲了獲得最佳幫助,您應該提供一個功能完整的獨立示例來展示問題,而不僅僅是複製所需代碼的子集。 – Phrogz 2013-05-03 02:12:42

+0

對不起。我的想法是,我打印了一系列ASCII格式的幀,我可以停止按鍵。它可以工作,但它完全吹走了任何幀中的任何換行符。我會盡快將一個更簡單的例子放在一起。 – SSEMember 2013-05-03 02:15:18

+1

看到我的'答案',表明你所描述的似乎不成問題。您需要一個削減測試用例,或者描述代碼失敗的操作系統和Ruby版本。 – Phrogz 2013-05-03 02:21:53

回答

2

下面的代碼可以按我的預期工作,包括打印換行符。如果它適合你,那麼你誤認了你的問題的原因。

swivel = Thread.new do 
    loop do 
    print "Hello\nWorld" 
    sleep 0.5 
    end 
end.run 

puts "Press Enter to Stop" 
str = STDIN.gets 

swivel.kill 

編輯:當你打電話stty raw -echo,任何\n字符只會往下走線。您需要\r\n先行到行的前面,然後\n下行到下一行。假設你的源文件是用「unix行結尾」(僅限\n)保存的,所以字符串中嵌入的換行符是不夠的。

+0

這段代碼提供了一個解決我的問題,但我仍然好奇爲什麼我上面提供的修改後的例子就像它一樣。我已將你的答案標記爲正確,因爲它解決了我的問題。 – SSEMember 2013-05-03 02:26:56

+1

@SSEMember回答更新了您編輯的問題的各種信息。 – Phrogz 2013-05-03 02:30:47

+0

謝謝!這解釋了很多,它解決了我的問題。 – SSEMember 2013-05-03 02:41:26