tenetjax
asked on
Obtaining user input without interrupting a timer cycle
I am writing a class which consists of member functions activated by True mod operations using lapTime below. I have a member function of my class calling itself and I want the screen to update a menu choice which allows the user to interact with the class. The problem is using cin or get waits for user input which throws off the execution of my functions when the time is right for them to do so.
an example:
void evaluate()
{
prompt_user();
if int(myTimer.lapTime()%20== 0)
eat();
evaluate();
}
how can I write code to grab input if it is present in the input stream but ignore the cin (or other appropriate command) until input is actually present?
I have included the public members of the systimer class I am using as a reference. (David Levine, Chris Nevison wrote systimer.h and systimer.cpp)
class SysTimer
{
public:
SysTimer(); // constructor
void start(); // begin timing
void stop(); // stop timing
void reset(); // reset timer to 0; stops watch
if running
bool isRunning()const; // true iff stopwatch is running
double lapTime()const; // number of microseconds since start
double elapsedTime()const; // microseconds between start
and stop
double cumulativeTime() const; // returns time since last reset
double granularity() const;
an example:
void evaluate()
{
prompt_user();
if int(myTimer.lapTime()%20==
eat();
evaluate();
}
how can I write code to grab input if it is present in the input stream but ignore the cin (or other appropriate command) until input is actually present?
I have included the public members of the systimer class I am using as a reference. (David Levine, Chris Nevison wrote systimer.h and systimer.cpp)
class SysTimer
{
public:
SysTimer(); // constructor
void start(); // begin timing
void stop(); // stop timing
void reset(); // reset timer to 0; stops watch
if running
bool isRunning()const; // true iff stopwatch is running
double lapTime()const; // number of microseconds since start
double elapsedTime()const; // microseconds between start
and stop
double cumulativeTime() const; // returns time since last reset
double granularity() const;
ASKER
Edited text of question.
ASKER
Edited text of question.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
I am using Windows 95 and this assignment is one I am doing with my computer science class. I am trying to teach them how to use classes and thus our programs will not be ported to another os. if you could give me more information on readconsole() or similar process in windows I would appreciate it, and do you have an alternate method of facilitating user interaction which will not interupt a timer?
Here a a few usefule procedures using the windows console API functions, they should get you started.
If you search in the help, you will find them well documented and you will find others.
************************** ***
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
FILE*fp;
enum Color
{
Red,
Green,
Blue,
Yellow,
Purple,
Cyan,
White,
Black
};
void GotoXY(int X,int Y)
{
HANDLE StdOut = GetStdHandle(STD_OUTPUT_HA NDLE);
COORD Coord = {X,Y};
SetConsoleCursorPosition(S tdOut,Coor d);
}
void OutputStr(const char *S)
{
HANDLE StdOut = GetStdHandle(STD_OUTPUT_HA NDLE);
int StrLen = strlen(S);
DWORD LenWrt;
WriteConsole(StdOut,S,StrL en,&LenWrt ,NULL);
}
void OutputStr(int X,int Y,const char *S)
{
GotoXY(X,Y);
OutputStr(S);
}
void ClearScreen()
{
HANDLE StdOut = GetStdHandle(STD_OUTPUT_HA NDLE);
CONSOLE_SCREEN_BUFFER_INFO BufInf;
COORD Origin = {0,0};
DWORD LenWrt;
GetConsoleScreenBufferInfo (StdOut,&B ufInf); // Get screen rows and columns.
int ChrCnt = BufInf.dwSize.X * BufInf.dwSize.Y; // Number of chars on screen.
FillConsoleOutputAttribute (StdOut,0, ChrCnt,Ori gin,&LenWr t);
FillConsoleOutputCharacter (StdOut,' ',ChrCnt,Origin,&LenWrt);
}
void SetColor(Color TxtCol,Color BckCol)
{
HANDLE StdOut = GetStdHandle(STD_OUTPUT_HA NDLE);
WORD Col = 0;
switch (TxtCol)
{
case Red: Col |= FOREGROUND_RED; break;
case Green: Col |= FOREGROUND_GREEN; break;
case Blue: Col |= FOREGROUND_BLUE; break;
case Yellow: Col |= FOREGROUND_RED | FOREGROUND_GREEN; break;
case Purple: Col |= FOREGROUND_RED | FOREGROUND_BLUE; break;
case Cyan: Col |= FOREGROUND_GREEN | FOREGROUND_BLUE; break;
case White: Col |= FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
}
switch (BckCol)
{
case Red: Col |= BACKGROUND_RED; break;
case Green: Col |= BACKGROUND_GREEN; break;
case Blue: Col |= BACKGROUND_BLUE; break;
case Yellow: Col |= BACKGROUND_RED | BACKGROUND_GREEN; break;
case Purple: Col |= BACKGROUND_RED | BACKGROUND_BLUE; break;
case Cyan: Col |= BACKGROUND_GREEN | BACKGROUND_BLUE; break;
case White: Col |= BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE; break;
}
SetConsoleTextAttribute(St dOut,Col);
}
************************** ***
If you search in the help, you will find them well documented and you will find others.
**************************
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
FILE*fp;
enum Color
{
Red,
Green,
Blue,
Yellow,
Purple,
Cyan,
White,
Black
};
void GotoXY(int X,int Y)
{
HANDLE StdOut = GetStdHandle(STD_OUTPUT_HA
COORD Coord = {X,Y};
SetConsoleCursorPosition(S
}
void OutputStr(const char *S)
{
HANDLE StdOut = GetStdHandle(STD_OUTPUT_HA
int StrLen = strlen(S);
DWORD LenWrt;
WriteConsole(StdOut,S,StrL
}
void OutputStr(int X,int Y,const char *S)
{
GotoXY(X,Y);
OutputStr(S);
}
void ClearScreen()
{
HANDLE StdOut = GetStdHandle(STD_OUTPUT_HA
CONSOLE_SCREEN_BUFFER_INFO
COORD Origin = {0,0};
DWORD LenWrt;
GetConsoleScreenBufferInfo
int ChrCnt = BufInf.dwSize.X * BufInf.dwSize.Y; // Number of chars on screen.
FillConsoleOutputAttribute
FillConsoleOutputCharacter
}
void SetColor(Color TxtCol,Color BckCol)
{
HANDLE StdOut = GetStdHandle(STD_OUTPUT_HA
WORD Col = 0;
switch (TxtCol)
{
case Red: Col |= FOREGROUND_RED; break;
case Green: Col |= FOREGROUND_GREEN; break;
case Blue: Col |= FOREGROUND_BLUE; break;
case Yellow: Col |= FOREGROUND_RED | FOREGROUND_GREEN; break;
case Purple: Col |= FOREGROUND_RED | FOREGROUND_BLUE; break;
case Cyan: Col |= FOREGROUND_GREEN | FOREGROUND_BLUE; break;
case White: Col |= FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
}
switch (BckCol)
{
case Red: Col |= BACKGROUND_RED; break;
case Green: Col |= BACKGROUND_GREEN; break;
case Blue: Col |= BACKGROUND_BLUE; break;
case Yellow: Col |= BACKGROUND_RED | BACKGROUND_GREEN; break;
case Purple: Col |= BACKGROUND_RED | BACKGROUND_BLUE; break;
case Cyan: Col |= BACKGROUND_GREEN | BACKGROUND_BLUE; break;
case White: Col |= BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE; break;
}
SetConsoleTextAttribute(St
}
**************************
ASKER