Каким образом можно в языке программирования С реализовать отслеживание нажатия клавиши на клавиатуре, не блокируя выполнение программы и не ожидая ввода от пользователя (без использования стандартных библиотек)?

Как можно реализовать в программе интерактивный режим, где программа продолжает выполнение, но обрабатывает определенный символ (например, Q/q) для выхода из цикла и завершения работы?
  • 17 марта 2024 г. 9:29
Ответы на вопрос 3
1. Для отслеживания нажатия клавиши в языке программирования C можно использовать функцию `kbhit()` и `getch()`. 

Вот пример кода, который будет отслеживать нажатие клавиши на клавиатуре без блокирования выполнения программы:

```c
#include <conio.h>

int main() {
    while (1) {
        if (kbhit()) {
            char key = getch();
            // обработка нажатой клавиши
        }
        
        // остальной код программы
        
        // прерывание выполнения по условию (например, по нажатию определенной клавиши)
    }
    
    return 0;
}
```

2. Для реализации интерактивного режима, где программа продолжает выполнение, но обрабатывает определенный символ для завершения работы, можно использовать тот же принцип с функциями `kbhit()` и `getch()`. 

Пример кода для интерактивного режима с выходом по нажатию клавиши `Q` или `q`:

```c
#include <conio.h>

int main() {
    char key;
    
    while (1) {
        // остальной код программы
        
        if (kbhit()) {
            key = getch();
            if (key == 'q' || key == 'Q') {
                break; // выход из цикла по нажатию клавиши Q/q
            }
        }
    }
    
    // код завершения программы
    
    return 0;
}
``` 

При использовании данных методов, учитывайте, что функции `kbhit()` и `getch()` являются частью расширений, специфичных для некоторых компиляторов и операционных систем.
Использовать хук пользовательского ввода системного API. В каждой ОС - свои механизмы. Например для винды: https://learn.microsoft.com/en-us/windows/win32/wi...
Можно запустить фоновый поток: он читает ввод и при получении Q/q выставляет флаг окончания. 
Псеводкод:

int should_stop = 0;

void keyboard_processor() {
     while (should_stop != 1) {
           char input = get_input();
           if (input == 'q' || input == 'Q') {
                  should_stop = 1;
                  break;
           }
     }
}
int main() {
    start_thread(keyboard_processor);
    while (should_stop != 1) {
          do_work();
    }
}
Похожие вопросы