943,948 Members | Top Members by Rank

Ad:
  • C++ Discussion Thread
  • Unsolved
  • Views: 3469
  • C++ RSS
Jun 1st, 2006
0

Monitoring an input buffer

Expand Post »
I've been trying to solve this problem for a while now with no luck. I want to monitor an input buffer(cin) for a keypress. The catch is, I don't want it to hang if the buffer is empty. getch() and peek() won't work because one waits for a keypress and the other waits for the return key. Is there any way to check for a keypress, but move on if there was no keypress? I know there is a DOS interrupt available in assembly, but I don't know how to do it with C.
Similar Threads
Reputation Points: 36
Solved Threads: 2
Junior Poster in Training
nanodano is offline Offline
78 posts
since Feb 2005
Jun 1st, 2006
0

Re: Monitoring an input buffer

If you have getch, you might have kbhit. That would be the easiest solution.
Administrator
Reputation Points: 6442
Solved Threads: 1393
Bad Cop
Narue is offline Offline
11,807 posts
since Sep 2004
Jun 1st, 2006
0

Re: Monitoring an input buffer

Narue,

I looked up kbhit() and I read that it typically was a Borland Turbo C++ thing. Sure enough though, MS Visual Studio 2005 has a _kbhit(). It worked like a charm! The thing is, kbhit() does not return the key you pressed, only wether a key is pressed or not. So, I wrote a simple piece of code for anyone who might be interested in doing something similar. Also, I noticed that if you fill the buffer with more than one keystroke, and you use getch() it gets the keys one at a time in the order you pressed them.

C++ Syntax (Toggle Plain Text)
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <windows.h>
  4.  
  5. using namespace std;
  6.  
  7. void main() {
  8. int hit;
  9. char ch = 0;
  10.  
  11. do {
  12. hit = kbhit();
  13. if (hit)
  14. ch = getch();
  15. else
  16. ch = 0;
  17. cout << ch << endl;
  18. Sleep(100);
  19. } while(ch != 27);
  20. }
Reputation Points: 36
Solved Threads: 2
Junior Poster in Training
nanodano is offline Offline
78 posts
since Feb 2005
Jun 1st, 2006
0

Re: Monitoring an input buffer

I'd like to add something (in case anyone is interested). An issue with the code I previously posted was that if there was a lot of time between calls to kbhit() and you only used one call to getch() then you might still have keystrokes left in the buffer. This might cause a problem if you want to assure you have the most recent keystroke. The simple solution is to nest a loop inside the if statement. I've included a ery slightly modified version of the previous code to show how to make sure you have only the most recent keypress.

C++ Syntax (Toggle Plain Text)
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <windows.h>
  4.  
  5. using namespace std;
  6.  
  7. void main() {
  8. int hit;
  9. char ch = 0;
  10.  
  11. do {
  12. hit = _kbhit();
  13. if (hit) {
  14. while (hit) {
  15. ch = _getch();
  16. hit = _kbhit();
  17. }
  18. }
  19. cout << ch << endl;
  20. Sleep(100);
  21. } while(ch != 27);
  22. }
Reputation Points: 36
Solved Threads: 2
Junior Poster in Training
nanodano is offline Offline
78 posts
since Feb 2005
May 2nd, 2009
0

Re: Monitoring an input buffer

Thanks to nanodano for his nifty piece of code! It's not all that easy to check the input buffer under Windows, and the sleep() feature does a nice job relinquishing the CPU while still checking periodically for user input...
Reputation Points: 10
Solved Threads: 0
Newbie Poster
cniggeler is offline Offline
1 posts
since May 2009

This thread is more than three months old

No one has posted to this discussion for at least three months. Please let old threads die and do not reply to them unless you feel you have something new and valuable to contribute that absolutely must be added to make the discussion complete. Otherwise, please start a new thread in this forum instead.
Message:
Previous Thread in C++ Forum Timeline: Text and SDL
Next Thread in C++ Forum Timeline: Unresolved External !#?%&





About Us | Contact Us | Advertise | Acceptable Use Policy
Forum Index | Build Custom RSS Feed


Follow us on Twitter


© 2011 DaniWeb® LLC