2011-01-13 2 views
3

들어오는 연결을 지속적으로 듣고 콘솔로 출력하는 루프는 while입니다. 나는 출력에 영향을 미치지 않고 콘솔을 통해 명령을 내릴 수 있기를 원합니다. 나는 시도했다 :스크립트를 일시 중지하지 않고 STDIN 입력을 어떻게들을 수 있습니까?

Thread.new do 
    while true 
     input = gets.chomp 
     puts "So I herd u sed, \"#{input}\"." 
     #Commands would be in this scope 
    end 
end 

그러나 입력이 수신 될 때까지 스크립트 전체가 일시 중지 된 것으로 보인다. 그리고 나서조차도,이 스레드가 실행되기 전에 시작한 스레드는 실행되지 않는 것 같습니다. 나는 TCPSocket의 select() 메소드를 사용하지 않으려 고 노력했다.

답변

5

예제에서 "계속 실행"하려는 명령이 어디에 있는지 잘 모릅니다. 이 작은 스크립트를보십시오 : 주요 스크립트가 계속 작동하면서 STDIN에서 읽기

Thread.new do 
    loop do 
    s = gets.chomp 
    puts "You entered #{s}" 
    exit if s == 'end' 
    end 
end 

i = 0 
loop do 
    puts "And the script is still running (#{i})..." 
    i += 1 
    sleep 1 
end 

는 별도의 스레드에서 이루어집니다.

+0

'i' 루프는 입력을 한 후에 만 ​​실행됩니다. :/ – Salt

+0

그런 경우에, Ruby on Windows는 짜증이납니다. :/ –

+0

죄송합니다. 1.9.2 대신 1.8.6을 사용하고있는 것 같습니다. 나는 그것을 업데이트했고 이제는 완벽하게 작동하고있다. :) 감사! – Salt

2

루비는 녹색 스레드를 사용하므로 블로킹 시스템 호출은 모든 스레드를 차단합니다. 아이디어 :

require 'io/wait' 

while true 
    if $stdin.ready? 
    line = $stdin.readline.strip 
    p "line from stdin: #{line}" 
    end 
    p "really, I am working here" 
    sleep 0.1 
end 
+0

'script.rb : 33 : ready in ': 소켓이 아닌 것에 작업이 시도되었습니다. (Errno :: ENOTSOCK)'이다. 또한, 내 소켓은 별도의 스크립트에 있으며 거기에 명령을 추가하려고하는 주요 스크립트가 아니라 실행됩니다. – Salt

+0

@salt, 창을 사용하고 있습니까? – tokland

+0

예, 있습니다. Win7x64. – Salt

관련 문제