Using std::cin.rdbuf()->in_avail()
I have a small command-line (console) application which, I thought, it would
be good to allow users to pause and to resume - or exit. To control this,
users will enter input at the command prompt. Actual processing occurs in a
different thread.
Here is a fragment of the code accepting user input:
---------------------------------------------------
std::cout << "Enter choice: 'P' - pause, 'Q' - quit: ";
char ch;
while (!finish) {
if (std::cin.rdbuf()->in_avail()) {
if (std::cin >> ch) {
std::cin.sync(); // flush remaining characters
switch (ch) {
case 'P':
case 'p':
do_process.stop();
std::cout << "Enter choice: 'R' - resume, 'Q' - quit: ";
break;
case 'R':
case 'r':
do_process.start();
std::cout << "Enter choice: 'P' - pause, 'Q' - quit: ";
break;
case 'Q':
case 'q':
finish = true;
return;
default:
std::cerr << "Unknown choice. Try again.\n";
}
}
else
std::cerr << "Error reading input.\n";
}
else
::Sleep(1000UL);
}
---------------------------------------------------
When instead of
char ch;
while (!finish) {
if (std::cin.rdbuf()->in_avail()) {
if (std::cin >> ch) {
I had
char ch;
while (std::cin >> ch) {
the code worked fine with the sole exception that if the user did not press
anything and let the applicaiton run to the end, on its termination he would
still have to press something, since "std::cin >> ch" would block. This was
the problem I tried to avoid by using std::cin.rdbuf()->in_avail(); however,
the code as written does not take any input until after the thread exits
when this becomes useless. Is there a way to cause, say, some termination
code in the thread doing processing to unblock std::cin when it is no longer
needed or is there perhaps a better way to use .in_avail()?
Thank you.
Paul