У меня есть цикл, который должен считывать выходные данные на оборудовании каждые 500 миллисекунд. Эта часть отлично работает. Однако, когда я пытаюсь ввести cin.get, чтобы подобрать нажатую клавишу «n», чтобы остановить цикл, я получаю только столько выходных сигналов, сколько нажатий клавиши до этой точки. Если я нажму несколько клавиш (кроме «n») несколько раз, а затем введу «Enter», я получу еще несколько выводов. Что мне нужно, так это продолжать цикл без какого-либо взаимодействия, пока я не хочу, чтобы он прекратился.
Вот код:
for(;;)
{
count1++;
Sleep(500);
analogInput = ReadAnalogChannel(1) / 51.0;
cout << count1*0.5 << " " << analogInput << endl;
outputFile << count1*0.5 << ", " << analogInput << endl;
if (cin.get() == 'n') //PROBLEM STARTS WITH THIS INTRODUCED
break;
};
Мой вывод выглядит следующим образом (есть 2 нажатия клавиш, чтобы перейти на этот этап в программе), если я не нажму еще несколько клавиш, а затем введите:
0.5 0 // as expected
1 2 // as expected
should be more values until stopped
У меня нет особого предпочтения в том, какой тип цикла использовать, если он работает.
Спасибо!
cin.get () является синхронный вызов, который приостанавливает текущий поток выполнения, пока не получит вводимый символ (вы нажимаете клавишу).
Вам нужно запустить ваш цикл в отдельном потоке и опрашивать атомарный логический тип, который вы изменяете в основном потоке после возврата cin.get ().
Это может выглядеть примерно так:
std::atomic_boolean stop = false;
void loop() {
while(!stop)
{
// your loop body here
}
}
// ...
int main() {
// ...
boost::thread t(loop); // Separate thread for loop.
t.start(); // This actually starts a thread.
// Wait for input character (this will suspend the main thread, but the loop
// thread will keep running).
cin.get();
// Set the atomic boolean to true. The loop thread will exit from
// loop and terminate.
stop = true;
// ... other actions ...
return EXIT_SUCCESS;
}
Примечание: приведенный выше код просто для наглядности, он использует библиотеку Boost и последнюю версию стандартной библиотеки C ++. Они могут быть недоступны для вас. Если это так, используйте альтернативы из вашей среды.
if (cin.get () == ‘n’)
Этот вызов остановит ваш цикл, пока он не получит ключ от вас. Там, останавливая свой цикл, как вы видите, происходит.
cin.get () будет сидеть до тех пор, пока не получит нажатие клавиши от вас.