Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > прерывание getch()


Автор: box 3.4.2015, 20:20
всем привет!
кто нибудь знает можно ли как сделать прерывание опроса клавы раз в секунду и вызвать подпрограмму тобиш надо что бы функция getch() вызывала подпрограмму раз в секунду
а то она морозит выполнение всего ядра пока не нажмеш кнопку 

Автор: feodorv 3.4.2015, 21:35
Цитата(box @  3.4.2015,  20:20 Найти цитируемый пост)
всего ядра

Простите, ядра чего?

Я бы использовал select на STDIN.

Автор: box 3.4.2015, 22:02
смотрите , есть функция:
Код


int _kbhit() {
    static bool inited = false;
    int left;

    if (!inited) {
        termios t;
        tcgetattr(0, &t);
        t.c_lflag &= ~ICANON;
        tcsetattr(0, TCSANOW, &t);
        setbuf(stdin, NULL);
        inited = true;
    }

    ioctl(0, FIONREAD, &left);

    return left;
}


она не ждет нажатие клавиши а просто выдает текушее состояние , можно конечно запустить бескончный цыкл но тогда проц упрется в полку и прийдется делать делать задержку sleep(1) а не хотелось бы прерывать опрос клавы 

Автор: feodorv 3.4.2015, 22:34
Гм. Вы смогли не ответить на вопрос и проигнорировать предложение))))

По предложению:
  • http://stackoverflow.com/questions/10219340/using-stdin-with-select-in-c
  • http://stackoverflow.com/questions/16147380/select-blocking-on-stdin-will-not-time-out
  • http://forums.devshed.com/programming-42/select-stdin-562149.html
  • и т.д.
Увы, подводных камней в этом решении проблемы я не помню, но, по-моему, нужно установить стдину посимвольную моду и не забывать вызывать fflush.

termio, ncurses etc могут и содержать в себе решение, но я его не знаю или не помню...

Так что за ядро?

Автор: box 3.4.2015, 22:48
в прямом смысле ядра процессора функция вешается на ядро проца

Автор: feodorv 3.4.2015, 23:06
Цитата(box @  3.4.2015,  22:48 Найти цитируемый пост)
в прямом смысле ядра процессора

Аааа. Ну это не страшно, а то я о другом подумал)))
Так как там связка select+stdin+timeout?

Автор: box 3.4.2015, 23:24
тобиш вы предлагаете делать таймоут чтобы проц не упирался в полку ? тогда как будет выглядеть код?

Автор: feodorv 3.4.2015, 23:41
Цитата(box @  3.4.2015,  23:24 Найти цитируемый пост)
тобиш вы предлагаете делать таймоут чтобы проц не упирался в полку ?
Конечно:
Цитата(box @  3.4.2015,  20:20 Найти цитируемый пост)
как сделать прерывание опроса клавы раз в секунду
Секунда здесь - типичный таймаут. При этом select обеспечивает, с одной стороны, этот самый таймаут, с другой - проверку на нажатие клавиши.


Цитата(box @  3.4.2015,  23:24 Найти цитируемый пост)
тогда как будет выглядеть код? 

Гм. А по ссылкам сходить, man select сделать?)))

Автор: baldina 3.4.2015, 23:46
Цитата(box @  3.4.2015,  22:48 Найти цитируемый пост)
в прямом смысле ядра процессора функция вешается на ядро проца 

у вас однозадачная среда типа DOS? тогда делайте цикл и не беспокойтесь о загрузке процессора: ему все равно больше нечем заняться.
у вас многозадачная ОС с вытеснением? тогда для вас две плохие новости и одна хорошая:
- не ваша программа управляет загрузкой процессора, а ОС
- процессор всегда занят, даже когда ОС показывает нулевую нагрузку. при нулевой нагрузке он занят исполнением "холостого" цикла ОС (в windows это https://ru.wikipedia.org/wiki/%D0%91%D0%B5%D0%B7%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B)

хорошая новость в том, что вам надо не создавать цикл, а поручить ОС оповестить вас о наступлении события (блокировать поток до наступления события, передав управление ОС).
в posix это select() и pool()
в windows это WaitForSingleObject() и т.п.

Автор: box 4.4.2015, 03:19
попробую покапать в сторону timeout() под ncurces для прерывания цыкла

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)