С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/64: Рейтинг темы: голосов - 64, средняя оценка - 4.77
0 / 0 / 1
Регистрация: 18.07.2015
Сообщений: 12

Проверка, нажата клавиша или нет, без остановки работы цикла

19.07.2015, 13:47. Показов 12857. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
нужна функция которая будет проверять нажата клавиша или нет, при этом она не должна останавливать работу цикла
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.07.2015, 13:47
Ответы с готовыми решениями:

Как проверять, нажата ли клавиша Esc, в каждой итерации цикла, и если нажата, то прервать выполнение цикла?
OwenGlendower, это обращение прежде всего к вам. Вызов функции, в которой происходит проверка методом...

Выход из цикла без остановки его работы
Дан код, при выполнение работы он ожидает нажатие клавиши. Я хочу узнать, как сделать так, чтобы при работе он не ожидал нажатия клавиши, а...

Выполнение цикла до тех пор, пока не будет нажата определенная клавиша
Доброе время суток, люди добрые! Начал заниматься С++ не так давно, поэтому всех хтростей не знаю, в следствие чего прошу о помощи....

9
1615 / 1181 / 552
Регистрация: 08.01.2012
Сообщений: 4,558
19.07.2015, 14:03
if(kbhit())
0
0 / 0 / 1
Регистрация: 18.07.2015
Сообщений: 12
19.07.2015, 15:07  [ТС]
khbit у меня как-то криво работает. приходится достаточно долго жать на клавишу. и при этом когда она срабатывает то консоль моментально закрывается, хотя я прописал system("pause")
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
19.07.2015, 16:30
Цитата Сообщение от Владимир12385 Посмотреть сообщение
khbit у меня как-то криво работает.
Пример в студию. Если у тебя итерация цикла выполняется долго, то и условие сработает не скоро.
0
0 / 0 / 1
Регистрация: 18.07.2015
Сообщений: 12
19.07.2015, 18:11  [ТС]
C++
1
2
3
4
5
6
7
while(1)
{
i++
if(khbit())
breack;
}
}
Добавлено через 1 минуту
а как сделать с помощью этой функции чтобы при нажатии на определенную клавишу выключало? а на другую допустим на паузу ставило?
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
19.07.2015, 20:30
Цитата Сообщение от Владимир12385 Посмотреть сообщение
а как сделать с помощью
Можно вот так:
C++
1
2
3
4
5
6
7
if (kbhit()) {
  char ch = getch();
  switch(ch) {
  case 'P'; \\ пауза
    break;
  }
}
0
0 / 0 / 1
Регистрация: 18.07.2015
Сообщений: 12
20.07.2015, 10:34  [ТС]
Подскажите пожалуйста какая функция будет делать тоже самое что и kbhit() но на unix платформе
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
20.07.2015, 11:52
Цитата Сообщение от Владимир12385 Посмотреть сообщение
Подскажите пожалуйста какая функция будет делать тоже самое что и kbhit() но на unix платформе
Есть два варианта.
1) В библиотеке ncurses есть функция getch(). Её можно сделать неблокируемой через nodelay(), затем, если нужно вызвать ungetch()
Пример нашел в инете
C
1
2
3
4
5
6
7
8
9
10
11
int kbhit(void)
{
    int ch = getch();
 
    if (ch != ERR) {
        ungetch(ch);
        return 1;
    } else {
        return 0;
    }
}
2. Можно и без ncurses. Пример тоже когда-то скопипастил.
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
int kbhit(void)
{
  struct termios oldt, newt;
  int ch;
  int oldf;
 
  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  newt.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
  fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
 
  ch = getchar();
 
  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  fcntl(STDIN_FILENO, F_SETFL, oldf);
 
  if(ch != EOF)
  {
    ungetc(ch, stdin);
    return 1;
  }
 
  return 0;
}
ИМХО, в чистой консоли такие вещи ни к чему. А в граф тулкитах, как и в curses, есть свои средства.
1
0 / 0 / 1
Регистрация: 18.07.2015
Сообщений: 12
20.07.2015, 13:51  [ТС]
А где в первом варианте ставить nodelsy
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
20.07.2015, 14:46
Цитата Сообщение от Владимир12385 Посмотреть сообщение
А где в первом варианте ставить nodelsy
В основной программе перед циклом с вызовом проверки, очевидно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.07.2015, 14:46
Помогаю со студенческими работами здесь

Проверить нажата ли клавиша F1 без использования GetKeyState и GetAsyncKeyState
Возможно ли проверить нажатие клавиши F1 другими методами? char e = { VK_F1 }; if (strcmp(e, "VK_F1") == 0) { ...

Нажата или отпущена конкретная клавиша С++
Доброго времени суток. Столкнулся с такой проблемой: на клавиатуре нажимается клавиша. Нужно определить что за клавиша нажата, и как долго....

ADC->DMA->SDIO (или NAND через FSMC) без остановки в обработчике прерываний DMA на STM32F407VG, реально или нет?
Добрый день. Столкнулся с необходимостью писать большой объём данных АЦП с высокой скоростью. Каналов 8. Частота АЦП максимальная. ...

Определить, какая клавиша Shift нажата: левая или правая
Уважаемые программисты нужна ваша помощь в написании программы. Она должна выводить сообщение о том какая клавиша Shift нажата: левая или...

Как узнать, нажата ли сейчас клавиша ctrl, alt или winkey?
Я сделал программу, которая набирает текст, введенный в эту программу, эмитируя нажатия на клавиатуре (для копипаста туда, где копипаст не...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru