loop until a key (i.e. enter or ESC) is pressed

Discussion in 'Ruby' started by Wurzel Cidermaker, Oct 30, 2007.

  1. I'm very new to Ruby (3 days).

    How do I escape from the loop below? - Without doing a CTRL-C.

    # loop forever...but I want to exit from it when a key is pressed

    def loopy

    i = 0

    while true

    i+=1

    puts i

    end

    end

    loopy
    --
    Posted via http://www.ruby-forum.com/.
    Wurzel Cidermaker, Oct 30, 2007
    #1
    1. Advertising

  2. Wurzel Cidermaker

    Tim Pease Guest

    On Oct 30, 2007, at 8:43 AM, Wurzel Cidermaker wrote:

    > I'm very new to Ruby (3 days).
    >
    > How do I escape from the loop below? - Without doing a CTRL-C.
    >
    > # loop forever...but I want to exit from it when a key is pressed
    >
    > def loopy
    > i = 0
    > while true
    > i+=1
    > puts i
    > end
    > end
    > loopy


    You will need to run your loopy method in a separate thread, and then
    kill that thread when the user presses any key on the keyboard ...

    t = Thread.new do
    i = 0
    while true
    i += 1
    puts i
    end
    end

    gets
    t.kill

    The above code won't work with any keypress -- you have to hit enter
    in order to stop the program.

    Blessings,
    TwP
    Tim Pease, Oct 30, 2007
    #2
    1. Advertising

  3. Tim Pease wrote:
    >
    > You will need to run your loopy method in a separate thread, and then
    > kill that thread when the user presses any key on the keyboard ...
    >
    > t = Thread.new do
    > i = 0
    > while true
    > i += 1
    > puts i
    > end
    > end
    >
    > gets
    > t.kill
    >
    > The above code won't work with any keypress -- you have to hit enter
    > in order to stop the program.
    >
    > Blessings,
    > TwP



    That does work properly.

    Is starts to display

    1
    2
    3
    ...
    ...
    127

    then stops and I presume is waiting for the "gets"

    To put this into some context;

    I have a socket client program that continously reads data from a
    server, the only way I have currently to stop it is to do a CTRL-C, I
    want/would expect a more elegant way of performing an exit on a loop.

    --
    Posted via http://www.ruby-forum.com/.
    Wurzel Cidermaker, Oct 30, 2007
    #3
  4. Wurzel Cidermaker

    ara.t.howard Guest

    On Oct 30, 2007, at 9:50 AM, Wurzel Cidermaker wrote:

    > then stops and I presume is waiting for the "gets"
    >
    > To put this into some context;
    >
    > I have a socket client program that continously reads data from a
    > server, the only way I have currently to stop it is to do a CTRL-C, I
    > want/would expect a more elegant way of performing an exit on a loop.


    start this before you fire up your socket stuff

    reaper =
    Thread.new do
    loop do
    Kernel.exit if gets == 'exit'
    end
    end

    if you type exit, your program will exit. check out highline or
    search the archives if you want something more elegant - exiting a
    loop and accepting cross platform user input is a real can of worms
    made complex by the lack of getch() on *nix platforms, the
    idiosyncracies of termninal attributes, and buffering issues with pty
    vs not.

    regards

    a @ http://codeforpeople.com/
    --
    it is not enough to be compassionate. you must act.
    h.h. the 14th dalai lama
    ara.t.howard, Oct 30, 2007
    #4
  5. ara.t.howard wrote:
    > On Oct 30, 2007, at 9:50 AM, Wurzel Cidermaker wrote:
    >
    >> then stops and I presume is waiting for the "gets"
    >>
    >> To put this into some context;
    >>
    >> I have a socket client program that continously reads data from a
    >> server, the only way I have currently to stop it is to do a CTRL-C, I
    >> want/would expect a more elegant way of performing an exit on a loop.

    >
    > start this before you fire up your socket stuff
    >
    > reaper =
    > Thread.new do
    > loop do
    > Kernel.exit if gets == 'exit'
    > end
    > end
    >
    > if you type exit, your program will exit. check out highline or
    > search the archives if you want something more elegant - exiting a
    > loop and accepting cross platform user input is a real can of worms
    > made complex by the lack of getch() on *nix platforms, the
    > idiosyncracies of termninal attributes, and buffering issues with pty
    > vs not.
    >
    > regards
    >
    > a @ http://codeforpeople.com/


    thanks for your response but I struggling to implement it.

    can you please fix what I have below?

    # example

    def loopy

    loop do

    puts Time.now
    sleep 1

    end

    end

    reaper =
    Thread.new do
    loop do
    Kernel.exit if gets == 'exit'
    end
    end

    loopy
    --
    Posted via http://www.ruby-forum.com/.
    Wurzel Cidermaker, Oct 30, 2007
    #5
  6. Wurzel Cidermaker

    ara.t.howard Guest

    On Oct 30, 2007, at 10:38 AM, Wurzel Cidermaker wrote:

    >
    > def loopy
    >
    > loop do
    >
    > puts Time.now
    > sleep 1
    >
    > end
    >
    > end
    >
    > reaper =
    > Thread.new do
    > loop do
    > Kernel.exit if gets == 'exit'
    > end
    > end
    >
    > loopy


    sorry, my fault, that 'gets' will have a newline on it, this works:

    cfp:~ > ruby a.rb
    Tue Oct 30 11:01:32 -0600 2007
    Tue Oct 30 11:01:33 -0600 2007
    Tue Oct 30 11:01:34 -0600 2007
    Tue Oct 30 11:01:35 -0600 2007
    Tue Oct 30 11:01:36 -0600 2007
    exit



    cfp:~ > cat a.rb
    def loopy
    loop do
    puts Time.now
    sleep 1
    end
    end

    reaper =
    Thread.new do
    loop do
    Kernel.exit if gets =~ /exit/
    end
    end

    loopy


    regards.

    a @ http://codeforpeople.com/
    --
    it is not enough to be compassionate. you must act.
    h.h. the 14th dalai lama
    ara.t.howard, Oct 30, 2007
    #6
  7. thanks...but...

    doesn't work on my Windows XP box!

    it prints the time once, then waits for input.

    any ideas why?
    --
    Posted via http://www.ruby-forum.com/.
    Wurzel Cidermaker, Oct 30, 2007
    #7
  8. Wurzel Cidermaker

    ara.t.howard Guest

    On Oct 30, 2007, at 11:17 AM, Wurzel Cidermaker wrote:

    > thanks...but...
    >
    > doesn't work on my Windows XP box!
    >
    > it prints the time once, then waits for input.
    >
    > any ideas why?


    you can't easily multi-plex io on windows with ruby. search the
    archvies but, mostly, this is very slippery and you have to have a
    deep understanding of ruby's thread model to accomplish it. search
    for 'threads blocking windows' in the archives. on *nix it's quite
    easy - with windows you are going to have to adapt to a multi process
    model i think. it's hard to say without knowing the details of your
    program.

    sorry!

    a @ http://codeforpeople.com/
    --
    it is not enough to be compassionate. you must act.
    h.h. the 14th dalai lama
    ara.t.howard, Oct 30, 2007
    #8
  9. Wurzel Cidermaker

    Dan Yoder Guest

    Another possible approach is to use trap to catch the TERM or INT
    signals. From there, you can use a variety of strategies to shut the
    program down gracefully. You can either hit CTRL-C (or CTRL-D if you
    catch TERM) or write a very simple second program that sends the
    signal to the first program (start and stop scripts, basically). The
    second program will need the process id for the first, which could be
    written out to a designated file using $$.

    I don't know if trap is supported on Vista. One method of implementing
    trap on Windows I've seen (but never used personally) is to wrap the
    Kernel's trap method, like this:

    def trap(signal)
    Kernel::trap(signal){yield}
    Thread.new{loop{sleep 1}}
    end

    You can easily simulate a trap by simply checking a designated file
    (you can use $$ to generate a unique filename) for a termination
    string (like TERM, ASCII 4) on each iteration of the loop. Then your
    shutdown script would simply write the termination string to the file
    and exit. The listener script would see the exit string and shut down.

    As noted by Ara, this problem is much simpler on Unix, where threading
    is better supported. In the next version of Ruby, native threading
    will be supported (including on Vista) so hopefully you won't need
    these kinds of tricks.

    Dan

    ---

    Dan Yoder
    http://dev.zeraweb.com/
    Ruby And JavaScript Consulting



    On Oct 30, 11:41 am, "ara.t.howard" <> wrote:
    > On Oct 30, 2007, at 11:17 AM, Wurzel Cidermaker wrote:
    >
    > > thanks...but...

    >
    > > doesn't work on my Windows XP box!

    >
    > > it prints the time once, then waits for input.

    >
    > > any ideas why?

    >
    > you can't easily multi-plex io on windows with ruby. search the
    > archvies but, mostly, this is very slippery and you have to have a
    > deep understanding of ruby's thread model to accomplish it. search
    > for 'threads blocking windows' in the archives. on *nix it's quite
    > easy - with windows you are going to have to adapt to a multi process
    > model i think. it's hard to say without knowing the details of your
    > program.
    >
    > sorry!
    >
    > a @http://codeforpeople.com/
    > --
    > it is not enough to be compassionate. you must act.
    > h.h. the 14th dalai lama
    Dan Yoder, Nov 2, 2007
    #9
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. =?Utf-8?B?cHJha2FzaHNoYQ==?=

    Reg: Stop processing when esc key is pressed

    =?Utf-8?B?cHJha2FzaHNoYQ==?=, Nov 30, 2004, in forum: ASP .Net
    Replies:
    3
    Views:
    698
    Eliyahu Goldin
    Nov 30, 2004
  2. Rune
    Replies:
    6
    Views:
    1,249
    Richie Hindle
    Jan 29, 2004
  3. mo
    Replies:
    7
    Views:
    1,272
    Peter Hansen
    Nov 9, 2005
  4. Dilbert
    Replies:
    8
    Views:
    336
  5. Stefan Mueller

    How to figure out if 'Esc' has been pressed

    Stefan Mueller, Jan 28, 2006, in forum: Javascript
    Replies:
    6
    Views:
    108
    drnicwilliams
    Jan 30, 2006
Loading...

Share This Page