Как пропустить Cin специально в C ++?

Мне нужно запустить цикл while и принимать входные данные, когда есть входные данные. Я не новичок в C ++, но это препятствие довольно сложно. Из-за NDA (этот школьный проект, по-видимому, является чем-то секретным), я могу только показать вам контрольный пример.

Я цеплялся за соломинку, пытаясь решить проблему; попробуйте catch, cin.get, cin.peek, if (cin.peek) {}. Если кто-нибудь может указать мне правильное направление, я был бы очень благодарен!

Программа не критична по времени, но функцию необходимо вызывать с фиксированным интервалом. Не обязательно, чтобы код был переносимым, чтобы он представлял собой комбинацию while-cin или что-то в этом роде; код будет работать только на ПК с Windows 7 или Windows 8, по крайней мере, с двухъядерным процессором.

#include <iostream>
#include <ctime>

using namespace std;

int main()
{
int input = 0;
int pastTime, nowTime;
pastTime = nowTime = time(0);

cin >> input;
while(input != -1)
{
if(input == 1)
{
cout << "Entered 1" << endl;
//To be done instead of the two 'elses',
//bypassing interval-dependant code
}
else if(input == 2)
{
cout << "Entered 2" << endl;
//To be done instead of the interval-dependant code
}
else if(pastTime == (nowTime - 5))
{
cout << "Nothing entered." << endl;
//Needs to be done with a fixed interval.
}
nowTime = time(0);
cin >> input;
}
return 0;
}

Решение было основано на ссылке Джеймса Билби:

// This program is based on counter.cpp from Boost\lib\thread\tutorial

#include <boost/thread/thread.hpp>
#include <iostream>
#include <ctime>

int timeNow = time(0);
int timePast = time(0);

void fct_one()
{
while(1) //keeps running all the time
{
if(timePast == (timeNow - 3)) // only executed once every three seconds
{
//do some stuff
timePast = time(0);
}
timeNow = time(0); // time is continuously updated
}
}

void fct_two()
{
int input = 0;
int timeTemp = time(0);
while(1) //keeps running all the time
{
std::cin >> input; // cin blocking for input
if(input == 1)
{
//do some stuff
}
if(input == 2)
{
//do some stuff
}
if(input == -1)
{
std::cout << "Program is done. ";
system("pause");
exit(1);
}
}
}

int main()
{
boost::thread_group threads;
threads.create_thread(&fct_one)
threads.create_thread(&fct_two);
threads.join_all();
return 0;
}

1

Решение

Я бы полностью отделить чтение ввода от cin и выполнение функции тайм-аута по умолчанию. Вам понадобится что-то вроде фонового потока, который выполняет функцию по умолчанию на основе временного интервала. Для обработки первых двух случаев вам нужно будет сообщить потоку, пропускающему следующее выполнение (если это действительно необходимо), и просто вызвать любую функцию, которую вы хотите, или ничего не делать.

0

Другие решения

Простой ответ — поместить код, выполняющийся с некоторым интервалом, в другой поток. Поскольку вы заметили, что это Windows, вы можете использовать Таймер Очередь:

Начните с процедур, чтобы начать и остановить свою работу, зависящую от времени:

HANDLE Start(HANDLE hTimerQueue)
{
DWORD timerMS = 5000; /* every 5 seconds */
HANDLE hTimer;
if (!CreateTimerQueueTimer(&hTimer,
hTimerQueue,
(WAITORTIMERCALLBACK)timerWork,
/*lpParam*/NULL,
/*start in ___ ms:*/0,
/*run every __ ms:*/timerMS,
/*flags*/0))
{
return NULL;
}

return hTimer;
}

BOOLEAN Stop(HANDLE hTimerQueue, HANDLE hTimer)
{
if (!DeleteTimerQueueTimer(hTimerQueue,
hTimer,
/*wait for our timer to complete*/INVALID_HANDLE_VALUE))
{
return FALSE;
}

return TRUE;
}

Затем поместите зависимую от времени работу в ее собственный обратный вызов:

VOID CALLBACK timerWork(PVOID lpParam, BOOLEAN TimerOrWaitFired /*ignored*/)
{
for (int ii = 0; ii < 10; ++ii) {
std::cout << "timer work: " << ii << std::endl;
Sleep(250);
}
}

Наконец, интегрируйте их в свой рабочий процесс:

int main(int argc, char* argv[])
{
HANDLE hTimerQueue = CreateTimerQueue(hTimerQueue);
if (NULL == hTimerQueue) return -1;
HANDLE hTimer = Start(hTimerQueue);
if (NULL == hTimer) return -1;

/* our timed callback is now running in the background */
int input = 0;
std::cin >> input;
while(input != -1)
{
if(input == 1)
{
if (Stop(hTimerQueue, hTimer)) {
std::cout << "Entered 1" << std::endl;
if (NULL == (hTimer = Start(hTimerQueue))) return -2;
}
}
else if(input == 2)
{
if (Stop(hTimerQueue, hTimer)) {
std::cout << "Entered 2" << std::endl;
if (NULL == (hTimer = Start(hTimerQueue))) return -2;
}
}

std::cin >> input;
}

DeleteTimerQueue(hTimerQueue);
return 0;
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector