【问题标题】:Printing in a Ruby Thread while waiting for input generates weird output在等待输入时在 Ruby 线程中打印会产生奇怪的输出
【发布时间】:2013-05-03 00:42:40
【问题描述】:

所以我在 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

重复直到按下一个键,我不知道为什么它没有。想法?

【问题讨论】:

  • 我强烈怀疑您可以将其简化为一个更简单的示例。此外,为了获得最佳帮助,您应该提供一个功能齐全的独立示例来展示问题,而不仅仅是重现它所需的代码子集。
  • 对不起。这个想法是我在 ascii 中来回打印一系列帧,我可以在击键时停止。它有效,但它完全消除了任何帧中的任何换行符。我很快就会整理出一个更简单的例子。
  • 查看我的“答案”,表明您所描述的似乎不是问题。你需要一个精简的测试用例,或者描述代码失败的操作系统和 Ruby 版本。

标签: ruby multithreading printing newline output


【解决方案1】:

以下代码按预期工作,包括打印换行符。如果它对您正常工作,那么您错误地确定了问题的原因。

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)保存的,因此字符串中嵌入的换行符是不够的。

【讨论】:

  • 这段代码解决了我的问题,但我仍然很好奇我上面提供的修改后的示例为什么会这样。我已将您的答案标记为正确,因为它解决了我的问题。
  • @SSEMember 答案已更新,包含有关您已编辑问题的信息。
猜你喜欢
  • 2015-08-18
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
相关资源
最近更新 更多