Тема: Як опрацювати натиск кнопки одразу

Вітаю!

Маю такий шматок коду:

    while (true) {
        if (kbhit() == 1) {
            ch = getch();
            if (ch == 'k') {
                mvprintw(1, 1, "Key k pressed.");
            }
        } else {            
            file_outputted = output_file(file_stream);       // output file
            pause(1);
            if (file_outputted) {         // Output information on the screen
                mvprintw(2, 1, "New turn.");
                refresh();
                if ( pause(2) == 1 ) {                    
                    move(2, 0); clrtoeol();                  
                    First.grow_bunnies();    
                    First.born_bunnies();        
                    First.sort_bunnies_by_age();        
                    First.describe_bunnies();
                }
            }
        }       
    }

Як зробити так, щоб при натисканні кнопки 'k', одразу виводити повідомлення. Бо в місцях pause(1) і pause(2) буде затримка на 1с і на 2с.

Білий Лунь

2

Re: Як опрацювати натиск кнопки одразу

    while (true) {
        if (kbhit() == 1) {
            ch = getch();
            if (ch == 'k') {
                mvprintw(1, 1, "Key k pressed.");
            }
        } else {            
            file_outputted = output_file(file_stream);       // output file
            if (file_outputted) {         // Output information on the screen
                mvprintw(2, 1, "New turn.");
                refresh();
                {                    
                    move(2, 0); clrtoeol();                  
                    First.grow_bunnies();    
                    First.born_bunnies();        
                    First.sort_bunnies_by_age();        
                    First.describe_bunnies();
                }
            }
        }       
    }

Будь ласка  *YES*

Maybe a = Just a | Nothing
Подякували: leofun01, Ярослав2

3

Re: Як опрацювати натиск кнопки одразу

kbhit - функція з досівської бібліотеки conio.h. MS DOS припинили підтримувати 20 років тому. Ви точно певні, що знаєте, що робите? Можете уточнити завдання?
kbhit повертає 0, якщо нічого не було натиснуто, і ненульове значення в іншому випадку. Ви порівнюєте його з 1. Ви точно знаєте, що робите?
Ну а так - крутіть цикл до !kbhit() || difftime(time(NULL)-t0)<1), де t0 - завчасно збережене значения часу, від якого обчислюється ваша секунда.

Подякували: FakiNyan, Ярослав, leofun013

4

Re: Як опрацювати натиск кнопки одразу

Вийшло так:

    while (true) {        
        do {
            file_outputted = output_file(file_stream);
            t0 = time(NULL);
            while (difftime(time(NULL), t0) < 1) {
                if (kbhit()) {
                    ch = getch();
                    if (ch == 'k') {
                        mvprintw(1, 1, "Key k pressed.");
                    }
                }
            }
        } while (file_outputted == 0);
        mvprintw(2, 1, "New turn.");
        refresh();
        t0 = time(NULL);
        while (difftime(time(NULL), t0) < 2) {
            if (kbhit()) {
                ch = getch();
                if (ch == 'k') {
                    mvprintw(1, 1, "Key k pressed.");
                }
            }
        }
        move(2, 0); clrtoeol();                  
        First.grow_bunnies();    
        First.born_bunnies();        
        First.sort_bunnies_by_age();        
        First.describe_bunnies();
    }
Білий Лунь