Non-blocking gets in Windows


#1

Hello, I know this topic has already been discussed here a while ago,
but I was wondering if anyone came up with a workaround or something.
I’m trying to write a script that checks email every - say - 10 minutes,
while still accepting user’s input, so that one can stop it.
This code works perfectly under linux:

def Prova1
running = true
th = Thread.new do
while running
inp = gets.chomp
running = false if [“QUIT”, “EXIT”].include?(inp.upcase)
puts “Ho ricevuto “#{inp}”…”
end
end
until th.join(0.5)
puts “Attesa…”
sleep 1
end
nil
end

but if run under Windows, the whole script stops as soon as “gets” is
reached, as if it was single-threaded.


#2

From: “Duckz King_duckz” removed_email_address@domain.invalid

but if run under Windows, the whole script stops as soon as “gets” is
reached, as if it was single-threaded.

I believe this works in ruby 1.9.1, now that native threads are used.

(I tested IO.popen on 1.9.1 on windows a few days ago, and finally all
of ruby is not blocked by a gets on the pipe. Yay!)

In ruby 1.8 and earlier, the trouble is that since ruby uses select() in
its thread scheduling, on windows, select() only works with sockets,
not other types of file handles. (I.e. windows is broken.)

Regards,

Bill