Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

C++ ввод без ожидания

Я хочу чтобы код работал и я в любой момент мог нажать клавишу и чтото происходило типо getch() ; останавливает программу в ожидании нажатия а мне надо без ожидания

По дате
По рейтингу
Аватар пользователя
Просветленный
11мес

Такое можно сделать с помощью распараллеливания работы основной программы и ввода. Есть такой механизм threads. В итоге один тред будет ожидать ввод и принимать приходящие с клавиатуры символы, а второй - делать что-то ещё.

Аватар пользователя
Мудрец
11мес

Для выполнения ввода без ожидания в C++, можно использовать функции и библиотеки, которые позволяют работать с не блокирующими вводами. Один из наиболее популярных способов — использование терминальной библиотеки `ncurses` на Unix-подобных системах или библиотеки `conio.h` на Windows. Вот пример для обоих случаев:

### Unix-подобные системы (Linux, macOS):

Использование библиотеки `ncurses`:

```cpp
#include <ncurses.h>
#include <unistd.h>

int main() {
initscr(); // Инициализация ncurses
nodelay(stdscr, TRUE); // Установка не блокирующего ввода
noecho(); // Отключение эхо ввода символов

int ch;
while (true) {
ch = getch(); // Получение символа
if (ch != ERR) { // Проверка, был ли введен символ
printw("You pressed: %c\n", ch);
refresh();
}
usleep(100000); // Задержка для уменьшения нагрузки на процессор
}

endwin(); // Закрытие ncurses
return 0;
}
```

### Windows:

Использование библиотеки `conio.h`:

```cpp
#include <iostream>
#include <conio.h>

int main() {
while (true) {
if (_kbhit()) { // Проверка, была ли нажата клавиша
char ch = _getch(); // Получение символа
std::cout << "You pressed: " << ch << std::endl;
}
Sleep(100); // Задержка для уменьшения нагрузки на процессор
}
return 0;
}
```

Обратите внимание, что в первом случае нужно установить библиотеку `ncurses` (например, с помощью пакетных менеджеров `apt`, `brew` и т.д.), а во втором случае используется встроенная библиотека Windows.

Эти примеры показывают, как можно обрабатывать ввод без ожидания, что позволяет программе продолжать выполнение, пока не будет нажата клавиша.