Форум программистов, компьютерный форум CyberForum.ru

Прерывание бесконечного цикла с возвратом значения нажатой клавиши в main() - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
alternknwn
0 / 0 / 0
Регистрация: 02.06.2011
Сообщений: 7
23.03.2012, 20:10     Прерывание бесконечного цикла с возвратом значения нажатой клавиши в main() #1
Вкратце, в функции main() есть некий объект класса - scene, также есть бесконечно работающий цикл while(1), в котором вызывается функция-член типа char того же класса: char ch=scene.start(), она должна возвращать значение нажатой клавиши, для дальнейшей работы с этим значением в операторе switch().
Тело функции char THandler::start() тоже должно содержать бесконечно работающий цикл:
C++
1
2
3
4
5
6
7
8
9
10
char THandler::start()
{
  for (int i=objy; ; i++)
  {
     Sleep(1000);
     system("cls");
     MoveObj(Direction);
     PaintData();
  }
}
Вопрос: как можно организовать прерывание цикла нажатием предусмотренной(желательно) клавиши внутри бесконечно работающей функции с передачей значения нажатой клавиши в main()?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NightCoder89
 Аватар для NightCoder89
12 / 12 / 1
Регистрация: 22.03.2012
Сообщений: 42
23.03.2012, 21:10     Прерывание бесконечного цикла с возвратом значения нажатой клавиши в main() #2
К примеру, так:

Код
char cMyChar = getchar(); // в переменной cMyChar хранятся нажатые клавиши
if(cMyChar == 'w') // если нажали w, то цикл остановлен
   break;
Deryck
5 / 5 / 0
Регистрация: 01.12.2010
Сообщений: 109
23.03.2012, 21:31     Прерывание бесконечного цикла с возвратом значения нажатой клавиши в main() #3
Цитата Сообщение от NightCoder89 Посмотреть сообщение
К примеру, так:
лично у меня такой код требует еще нажатие enter после клавиши
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
23.03.2012, 21:32     Прерывание бесконечного цикла с возвратом значения нажатой клавиши в main() #4
kbhit()
alternknwn
0 / 0 / 0
Регистрация: 02.06.2011
Сообщений: 7
23.03.2012, 22:08  [ТС]     Прерывание бесконечного цикла с возвратом значения нажатой клавиши в main() #5
Цитата Сообщение от Deryck Посмотреть сообщение
лично у меня такой код требует еще нажатие enter после клавиши
верно, поэтому такой вариант не подходит для непрерывной работы программы, которая управляет данными по таймеру в зависимости от нажатых клавиш.
скажем, в цикле while(1) использовался:
C++
1
2
3
4
char ch;
ch=_getch();
if(!ch) ch=_getch();
switch(ch){}
но такой код не позволяет обрабатывать паралельно 2й непрерывно работающий цикл, вызываемый до, или после выполнения switch(), потому что просто ждет нажатия клавиши, и не дает возможности продолжить работу программы, пока не нажата клавиша.
Поэтому в main() вызывается scene.start() в бесконечном цикле while(1), а из неё передается код для вызова определенных методов в switch(), который в свою очередь обрабатывает данные и на 2м шаге опять вызывает scene.start()...

Цитата Сообщение от panicwassano Посмотреть сообщение
kbhit()
kbhit() возвращает не ноль в случае нажатия клавиши клавиатуры и ноль в противном случае, а надо char или (int)char.
alternknwn
0 / 0 / 0
Регистрация: 02.06.2011
Сообщений: 7
24.03.2012, 02:23  [ТС]     Прерывание бесконечного цикла с возвратом значения нажатой клавиши в main() #6
В общем после небольших экспериментов, получилось что-то более-менее приемлемое с частотой обновления кадров ~20/сек...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class THandler
{
   ...
   int cycles;
public:
   char start();  // в конструкторе cycles=0; накапливает количество пройденых "фреймов".
   ...
};
 
char THandler::start()
{
   char ch;
   BYTE t=1;
   fflush(stdin);
   do {
      Sleep((DWORD)t*50);       // 50ms задержка
      if ((cycles%20)==0)         // каждую секунду вызов функций
      {
         system("cls");
         MoveObj(Direction);
         PaintData();
      }
      cycles++;
   } while (!(_kbhit()));
   ch=_getch();                    // берет символ из stdin
   return ch;
}
 
int main()
{
   THandler scene;
   ...
   while(1)
   {
      ch=scene.start();
      switch(ch)
      {
         ...
      }
   }
   ...
   return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2016, 05:21     Прерывание бесконечного цикла с возвратом значения нажатой клавиши в main()
Еще ссылки по теме:

Возврат значения нажатой клавиши C++
C++ Как получить имя нажатой клавиши
Определение нажатой клавиши,консольное приложение. C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
SergVSD
0 / 0 / 0
Регистрация: 27.03.2015
Сообщений: 6
31.03.2016, 05:21     Прерывание бесконечного цикла с возвратом значения нажатой клавиши в main() #7
Сработало как часики большое спасибо
Yandex
Объявления
31.03.2016, 05:21     Прерывание бесконечного цикла с возвратом значения нажатой клавиши в main()
Ответ Создать тему
Опции темы

Текущее время: 06:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru