Unexpected output with the Curses.getch function call

Greetings!

The following code terminates the application right after the
Kernel#exit function call:

first = Thread.new do
loop {
gets.chomp
}
end

second = Thread.new do
Kernel::exit
end

second.join
first.join

However, if I replace the gets.chomp with the Curses.getch function
call, I’ve got an unexpected result – the application will wait for the
next user input and terminates only after it.

Why? Can I somehow fix this behavior?

OS – Windows 8.

ruby 2.0.0p481 (2014-05-08) [x64-mingw32]

Thanks in advance.


This email is free from viruses and malware because avast! Antivirus
protection is active.

Hi Nikita Trophimov,

Perhaps it’s a time slicing issue.
I think gets is not blocking the thread and Kernel.exit in its own
time slice puts everything down.

With Curses.getch I think the thread gets blocked waiting for input.

Instructing the other thread to sleep makes the chomp work.

require ‘curses’

first = Thread.new do
loop {
ch = gets.chomp
puts “You have typed #{ch}”
}
end

second = Thread.new do
sleep 5.0 # <— Sleep for 5 seconds “passing” to the other threads.
Kernel::exit
end

second.join
first.join

Try to block the first thread in another way.
(12345 ** 10 ** 6).prime?
The operation above takes some seconds on my machine.
So I see the same effect as Curses.getch.

first = Thread.new do
loop {
if (12345 ** 10 ** 6).prime?
puts “It’s prime”
else
puts “It’s not prime”
end
}
end

second = Thread.new do
Kernel::exit
end

second.join
first.join

See: Merbist

Abinoam Jr.

On Mon, Aug 18, 2014 at 6:21 PM, Nikita Trophimov

In both cases I see the same result as in my first example with
gets.chomp – the whole application was shutdown without any key press.
Is there difference between our environment? Maybe OS or Ruby version?

On 8/19/2014 3:11 PM, Abinoam Jr. wrote:

require ‘curses’
Kernel::exit
first = Thread.new do
Kernel::exit
[email protected] wrote:

This email is free from viruses and malware because avast! Antivirus
protection is active.
http://www.avast.com


This email is free from viruses and malware because avast! Antivirus
protection is active.

On Mon, Aug 18, 2014 at 11:21 PM, Nikita Trophimov
[email protected] wrote:

Why? Can I somehow fix this behavior?

I am suspecting threading. Code in Curses suggests that there are
threads involved whereas Kernel.gets will just do plain IO.

(click on source view)

Kind regards

robert