Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 02.06.2011
Сообщений: 7
1

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

23.03.2012, 20:10. Показов 4348. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вкратце, в функции 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()?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2012, 20:10
Ответы с готовыми решениями:

Прерывание бесконечного цикла нажатием горячей клавиши
Такое дело: надо, чтобы при нажатии на кнопку начиналась функция и выполнялась до тех пор, пока не...

Прерывание бесконечного цикла
У меня есть код с бесконечным циклом. В этом коде долго происходят действия. Я хочу сделать...

Прерывание бесконечного цикла по кнопке
Всем привет! Есть программа, по нажатию кнопки на форме запускается код, собирающий информацию с...

Выход из бесконечного цикла по нажатию клавиши
как выйти из бесконечного цикла по нажатию клавиши? begin: ..... jmp begin 8h ждет нажатия...

6
12 / 12 / 1
Регистрация: 22.03.2012
Сообщений: 42
23.03.2012, 21:10 2
К примеру, так:

Код
char cMyChar = getchar(); // в переменной cMyChar хранятся нажатые клавиши
if(cMyChar == 'w') // если нажали w, то цикл остановлен
   break;
0
5 / 5 / 0
Регистрация: 01.12.2010
Сообщений: 109
23.03.2012, 21:31 3
Цитата Сообщение от NightCoder89 Посмотреть сообщение
К примеру, так:
лично у меня такой код требует еще нажатие enter после клавиши
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
23.03.2012, 21:32 4
kbhit()
0
0 / 0 / 0
Регистрация: 02.06.2011
Сообщений: 7
23.03.2012, 22:08  [ТС] 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.
0
0 / 0 / 0
Регистрация: 02.06.2011
Сообщений: 7
24.03.2012, 02:23  [ТС] 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;
}
0
0 / 0 / 0
Регистрация: 27.03.2015
Сообщений: 10
31.03.2016, 05:21 7
Сработало как часики большое спасибо
0
31.03.2016, 05:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2016, 05:21
Помогаю со студенческими работами здесь

Есть ли возможность реализовать прерывание цикла консольного приложения нажатием клавиши?
Выполняется цикл, при нажатии клавиши (например "А") цикл прерывается, но программа не закрывается....

Возврат значения нажатой клавиши
Подскажите ассемблеровскую вставку для С++. Чтобы возвращалось значение нажатой клавиши

Опрос кода клавиши для остановки бесконечного цикла
Доброй ночи. Курсовая работа на тему создания справочника по резисторам. Пытаюсь писать по кускам....

Выход из бесконечного цикла в GraphABC при нажатии клавиши (любой)
Здравствуйте! У меня такая проблема: Дан цикл: uses GraphABC repeat ...... until...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru