Организация асинхронного ввода/вывода - C (СИ)
Формулировка задачи:
Доброе время суток.
Подскажите, как организовать ассинхронный ввод в СИ. Допустим, есть программа, внутри бесконечный цикл который себе работает и никого не трогает. Как сделать так, чтобы программа реагировала на нажатие клавиши? Может есть какие-то функции, библиотеки. Реализацию под windows и linux, пожалуйста.
Или подскажите в какую сторону копать
Решение задачи: «Организация асинхронного ввода/вывода»
textual
Листинг программы
#include <process.h>
#include <stdio.h>
#include <time.h>
#include<conio.h>
int a[5];
void Delay(unsigned int Sec)
{
clock_t ticks1 = clock(), ticks2 = ticks1;
clock_t target = Sec * CLOCKS_PER_SEC;
while ((ticks2 - ticks1) < target)
ticks2 = clock();
}
void Thread(void* pParams)
{
int i, num = 0;
while (1)
{
Delay(1);
for (i = 0; i < 5; i++) a[i] = num;
num++;
}
}
int main(void)
{
_beginthread(Thread, 0, NULL);
while (1)
{
_getch();
printf("%d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4]);
}
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
, , , - Объявляем массив a размером 5
- Определяем функцию Delay, которая имитирует задержку в указанное количество секунд. Она использует функцию clock() для получения текущего значения системного таймера, а затем сравнивает это значение с целевым значением, умноженным на CLOCKS_PER_SEC. Пока разница между текущим и целевым значениями меньше заданного количества секунд, функция продолжает возвращать текущее значение системного таймера.
- Определяем функцию Thread, которая является потоком. Она объявляет переменную i типа int и инициализирует ее значением 0, а также переменную num типа int со значением 0. В цикле while(1) происходит задержка в 1 секунду с помощью функции Delay, после чего значения массива a устанавливаются равными значению переменной num, и сама переменная num увеличивается на 1.
- В функции main создается поток с помощью функции _beginthread, которая принимает три аргумента: адрес функции, которую нужно выполнить в потоке (в данном случае Thread), 0 (который используется как флаг, указывающий, что новый поток должен быть создан) и NULL (который используется как указатель на параметры, передаваемые функции).
- В цикле while(1) программа ожидает нажатия клавиши с помощью функции _getch, после чего выводит значения массива a на экран с помощью функции printf.
- Программа завершается возвратом значения 0 из функции main.