Pastebin is 300% more awesome when you are logged in. Sign Up, it's FREE!
Guest

Untitled

By: a guest on May 27th, 2012  |  syntax: C++  |  size: 1.65 KB  |  hits: 11  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
This paste has a previous version, view the difference. Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <time.h>
  4. #include <thread>
  5. #include <curses.h>
  6. #include <termios.h>
  7.  
  8. void SleepForNumberOfSeconds(const int & numberofSeconds,bool & timesUp);
  9. void WaitForTimeoutOrInterrupt(int const& numberofSeconds);
  10. int keypress(void);
  11. void nonblock(const bool state);
  12.  
  13. int main(){
  14.        
  15.         std::cout << "waiting for 3 seconds or until a key is pressed" << std::endl;
  16.         WaitForTimeoutOrInterrupt(3);
  17.        
  18.         return EXIT_SUCCESS;
  19. }
  20.  
  21. void SleepForNumberOfSeconds(const int & numberofSeconds,bool & timesUp){
  22.        
  23.         timespec delay = {numberofSeconds,0}; //500,000 = 1/2 milliseconds
  24.         timespec delayrem;
  25.        
  26.         nanosleep(&delay, &delayrem);
  27.         timesUp = true;
  28.        
  29.         return;
  30. }
  31. void WaitForTimeoutOrInterrupt(int const& numberofSeconds){
  32.        
  33.         bool timesUp = false;
  34.        
  35.         std::thread t(SleepForNumberOfSeconds, numberofSeconds, std::ref(timesUp));
  36.         nonblock(1);
  37.         while (!timesUp && !keypress()){
  38.                
  39.         }
  40.        
  41.         if (t.joinable()){
  42.                 t.detach();
  43.         }
  44.         nonblock(0);
  45.        
  46.         return;
  47. }
  48. int keypress(void){
  49.         struct timeval tv;
  50.         fd_set fds;
  51.         tv.tv_sec = 0;
  52.         tv.tv_usec = 0;
  53.         FD_ZERO(&fds);
  54.         FD_SET(STDIN_FILENO, &fds); //STDIN_FILENO is 0
  55.         select(STDIN_FILENO+1, &fds, NULL, NULL, &tv);
  56.         return FD_ISSET(STDIN_FILENO, &fds);
  57. }
  58. void nonblock(const bool state){
  59.        
  60.         struct termios ttystate;
  61.        
  62.         //get the terminal state
  63.         tcgetattr(STDIN_FILENO, &ttystate);
  64.        
  65.         if (state){
  66.                 //turn off canonical mode
  67.                 ttystate.c_lflag &= ~ICANON;
  68.                 //minimum of number input read.
  69.                 ttystate.c_cc[VMIN] = 1;
  70.         }
  71.         else{
  72.                 //turn on canonical mode
  73.                 ttystate.c_lflag |= ICANON;
  74.         }
  75.        
  76.         //set the terminal attributes.
  77.         tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
  78. }