@поваренная соль. Облом, Windows не поддерживает "select" для дескрипторов, не относящихся к сокетам, поэтому я понятия не имею, что вы можете сделать.

я естьwhile Цикл последовательно прослушивает входящие соединения и выводит их на консоль. Я хотел бы иметь возможность выдавать команды через консоль, не влияя на вывод. Я пробовал:

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

Тем не менее, это, кажется, приостанавливает весь мой сценарий, пока ввод не получен; и даже тогда некоторые потоки, которые я инициировал до этого, похоже не выполняются. Я пытался смотреть на TCPSocket'sselect() метод безрезультатный.

Ответы на вопрос(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
 tokland14 янв. 2011 г., 14:06
@поваренная соль. Облом, Windows не поддерживает "select" для дескрипторов, не относящихся к сокетам, поэтому я понятия не имею, что вы можете сделать.
 tokland13 янв. 2011 г., 18:18
@Salt, вы используете Windows?
 Salt13 янв. 2011 г., 17:58
script.rb:33:inготов? »: была предпринята попытка выполнить операцию с чем-либо, кроме сокета. (Errno :: ENOTSOCK) `. Кроме того, мои сокеты находятся в отдельном сценарии и выполняются там, а не в основном сценарии, к которому я пытаюсь добавить команды.
 Salt13 янв. 2011 г., 21:09
Да. Win7x64.
Решение Вопроса

где находятся команды, которые вы хотите «продолжить» в вашем примере. Попробуйте этот небольшой скрипт:

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

Чтение из STDIN выполняется в отдельном потоке, в то время как основной скрипт продолжает работать.

 Salt13 янв. 2011 г., 22:14
i Цикл выполняется только после ввода данных. : /
 Salt13 янв. 2011 г., 22:23
Сожалею; кажется, я использовал 1.8.6 вместо 1.9.2. Я обновил и теперь работает отлично. :) Спасибо!
 Mladen Jablanović13 янв. 2011 г., 22:21
В этом случае Ruby на Windows - отстой. : /

Ваш ответ на вопрос