Quit, if a specific key is hit

  • Thread starter Pavankumar Kulkarni
  • Start date
P

Pavankumar Kulkarni

J

James Gray

Excuse me, if this is already discussed... but from from here <http://www.rubyrailways.com/implementing-15-exercises-for-learning-a-new-programming-language/
solved.. whats the reason?
"Display series of numbers (1,2,3,4, 5....etc) in an infinite loop.
The program should quit if someone hits a specific key (Say ESCAPE
key)."

It can definitely be solved. Here's a solution that works on most
Unix-like operating systems, for example:

#!/usr/bin/env ruby -wKU

require "io/wait"

state = `stty -g`
begin
system "stty raw -echo cbreak isig"

1.upto(1.0/0.0) do |n|
puts n
exit if $stdin.ready? and $stdin.getc == 27
end

ensure
system "stty #{state}"
end

__END__

What the author actually said was that it can't solve it without
writing some platform specific code or threads. I don't know how to
do it without using one of those tricks either.

The reason is that all terminals are different and you are needing to
interact with it on two levels at once (reading while writing). This
is what introduces the need for the platform specific code.

James Edward Gray II
 
J

John Joyce

It can definitely be solved. Here's a solution that works on most
Unix-like operating systems, for example:

#!/usr/bin/env ruby -wKU

require "io/wait"

state = `stty -g`
begin
system "stty raw -echo cbreak isig"

1.upto(1.0/0.0) do |n|
puts n
exit if $stdin.ready? and $stdin.getc == 27
end

ensure
system "stty #{state}"
end

__END__

What the author actually said was that it can't solve it without
writing some platform specific code or threads. I don't know how
to do it without using one of those tricks either.

The reason is that all terminals are different and you are needing
to interact with it on two levels at once (reading while writing).
This is what introduces the need for the platform specific code.

James Edward Gray II
In many of the game libraries, input for different platforms is
addressed.
This one of those cases where the game libraries, such as Gosu or
rubygame, or Ruby/SDL are going to be very useful for a non game.
most game libs have a very fundamental need for input control, and a
pretty important need for crossplatform code abstraction.
You don't need to know much about them, just enough to get the keys
under your control!
But the plus is, you can also get a GUI up without much work.
 
M

Marcelo

I found a platform independent solution to this in one of the comments
of that link(below) here
<http://www.rubyrailways.com/impleme...ning-a-new-programming-language/#comment-1145>.

That does not fulfill the stated requirements, does it?
i=0
loop do
begin
break if STDIN.read_nonblock(1000)

C defines stdin to be buffered, so characters will pile up in the
buffer until an EOL is seen or the buffer is full. It might be the
case that some platform does not do this, but in general the program
won't stop until you press a lot of keys or (usually), press enter.

Marcelo
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,276
Messages
2,571,384
Members
48,073
Latest member
ImogenePal

Latest Threads

Top