Channels ▼
RSS

Design

C Snippet #8



Q: HOW DO I... put timers with default actions in my C code?

A: Many times, we need to write programs that will only wait a certain specified amount of time for a user to do something. After that time, we need to assume that the user isn't going to do anything and move on to some specified default action. This Snippet works exactly like the get_ch() function in most PC C compiler libraries, except that it will only wait as long as you tell it for the user to hit a key. If no key is pressed within the time limit, the function returns with an EOF. As usual, a test harness has been added to allow for stand-alone testing. To compile the stand-alone test, simply define the TEST macro.



/*
**  TIMEGETC.C - waits for a given number of seconds for the user to press
**               a key.  Returns the key pressed, or EOF if time expires
**
**  Public domain by Bob Jarvis
**  Test harness added by Bob Stout
**
**  Note: This relies on the non-standard kbhit() function, which is available
**        in all Windows PC compilers - including MinGW32 (gcc).
*/

#include <stdio.h>
#include <time.h>
#include <conio.h>

int timed_getch(int n_seconds)
{
      time_t start, now;

      start = time(NULL);
      now = start;

      while(difftime(now, start) < (double)n_seconds && !kbhit())
      {
            now = time(NULL);
      }

      if(kbhit())
            return getch();
      else  return EOF;
}

#ifdef TEST

main()
{
      int c;
      const char *ctrlchars[] =
      {
            "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",
            "BS_", "HT_", "LF_", "VT_", "FF_", "CR_", "SO_", "SI_",
            "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",
            "CAN", "EM_", "SUB", "ESC", "FS_", "GS_", "RS_", "US_"
      };
     
      printf("Starting a 5 second delay...\n");

      c = timed_getch(5);

      if(c == EOF)
            printf("Timer expired\n");
      else
      {
            printf("Key ");
            if (c < 0x20)
                  printf("(%s)", ctrlchars[c]);
            else if (0x7f == c)
                  printf("(DEL)");
            else  printf("('%c')", c);
            printf(" was pressed\n", c);
      }
      return 0;
}

#endif /* TEST */

More C Snippets

All the code in C Snippets is either public domain or freeware and may therefore freely be used by the C programming community without restrictions. In most cases, if the original author is someone other than myself he or she will be identified. Thanks to all who have contributed to this collection over the years. I hope Dr. Dobb's readers will find these useful.

--Bob Stout
rbs@snippets.org


Related Reading


More Insights






Currently we allow the following HTML tags in comments:

Single tags

These tags can be used alone and don't need an ending tag.

<br> Defines a single line break

<hr> Defines a horizontal line

Matching tags

These require an ending tag - e.g. <i>italic text</i>

<a> Defines an anchor

<b> Defines bold text

<big> Defines big text

<blockquote> Defines a long quotation

<caption> Defines a table caption

<cite> Defines a citation

<code> Defines computer code text

<em> Defines emphasized text

<fieldset> Defines a border around elements in a form

<h1> This is heading 1

<h2> This is heading 2

<h3> This is heading 3

<h4> This is heading 4

<h5> This is heading 5

<h6> This is heading 6

<i> Defines italic text

<p> Defines a paragraph

<pre> Defines preformatted text

<q> Defines a short quotation

<samp> Defines sample computer code text

<small> Defines small text

<span> Defines a section in a document

<s> Defines strikethrough text

<strike> Defines strikethrough text

<strong> Defines strong text

<sub> Defines subscripted text

<sup> Defines superscripted text

<u> Defines underlined text

Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task. However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.

 
Disqus Tips To upload an avatar photo, first complete your Disqus profile. | View the list of supported HTML tags you can use to style comments. | Please read our commenting policy.
 

Video