FREE Subscription to Dr. Dobb’s Digest: Same Great Content, New Digital Edition
Site Archive (Complete)
C++
Email
Print
Reprint

add to:
Del.icio.us
Digg
Google
Furl
Slashdot
Y! MyWeb
Blink
November 07, 2009
C Snippet #8

Bob Stout
Timers and default actions

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

TOP 5 ARTICLES
No Top Articles.



MICROSITES
FEATURED TOPIC

ADDITIONAL TOPICS

INFO-LINK