Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zamykanie lub kontynuowanie programu po wciśnięciu przycisku.

Ostatnio zmodyfikowano 2016-09-11 21:11
Autor Wiadomość
Tomal
Temat założony przez niniejszego użytkownika
Zamykanie lub kontynuowanie programu po wciśnięciu przycisku.
» 2016-09-10 15:47:03
Program to minutnik wielorazowego użytku, żeby użytkownik nie musiał go odpalać za każdym razem. Chciałem żeby był w miarę zautomatyzowany i do zamknięcia programu wystarczyło wciśnięcie klawisza bez "enterowania".
C/C++
while( !kbhit() )
{
    Beep( 500, 300 );
}
//getch();
cin.clear();
cin.sync();
Sleep( 300 );
printf( "Press 1 to RUN program again\n" );
if( 49 != getch() )
     break;

} while( true );

return 0;

W pętli while również program czeka na przyciśnięcie dowolnego klawisza i niestety ten klawisz automatycznie zostaje pobrany do getch(). Jak widać chciałem nieudolnie czyścić cin, albo wstawić funkcję "Sleep", żeby program miał czas żeby wyczyścić strumień(???). Program działa według mojej myśli jeśli zamiast linijek "cin.clear(); cin.sync();Sleep(300)" wstawię sztucznie getch(), bo wtedy znak z pętli while zostaje przechwycony. Jest to jakieś rozwiązanie, ale zastanawiam się co jest nie tak z cin.clear() oraz cin.synch()?
P-151642
marcolo2307
» 2016-09-10 16:06:45
Nie do końca rozumiem o co ci chodzi.
cin.clear() i sync() wpływają na strumień. Nie wiem jak dokładnie działa getch(), ale raczej nie korzysta ze strumienia, tylko pobiera klawisz z event'u.
P-151643
Tomal
Temat założony przez niniejszego użytkownika
» 2016-09-10 16:31:13
Generalnie chodzi o to że kiedy minutnik się skończy, to program czeka aż użytkownik wciśnie dowolny klawisz (pętla while), i potem według założenia program miałby wyświetlać informacje o tym, że po przyciśnięciu "1" program będzie kontynuowany - w innym wypadku zostanie zamknięty. Jednak przy pętli while, kiedy wciskam np 2 żeby kontynuować i przejść do linijki z getch(), "2" zostaje przypisana do getch() - które powinno dopiero potem zbierać informacje o wciśniętym klawiszu. Program zostaje zamknięty, a powinien czekać aż użytkownik drugi raz wciśnie znak na klawiaturze. Czyli powinienem jakoś "czyścić" event'a? Mogę wkleić całość kodu i dać linka tutaj jeśli to pomoże?
P-151647
marcolo2307
» 2016-09-10 17:11:46
Wklej kod tutaj. Getch chyba zwraca ci ostatni klawisz (nie mam pewności jak to działa tam głębiej, bo nie korzystam).
C/C++
if( kbhit() )
if( getch() == '1' )
     break;

Ten kod przerwie pętlę jeśli wciśniesz klawisz, jednocześnie nie blokując jej.

Kiedy wywołasz dwa razy getch może ono zwrócić różne wyniki, jeśli chcesz go zachować to go zapisz w zmiennej.
P-151650
Tomal
Temat założony przez niniejszego użytkownika
» 2016-09-11 20:08:16
C/C++
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <stdio.h>

using namespace std;

int main()
{
    int czas, h, m, s, a = 0;
    do
    {
        cout << "Set up your time: " << endl;
        cout << "Hours:";
        cin >> h;
        cout << "Minutes:";
        cin >> m;
        cout << "Seconds:";
        cin >> s;
        czas = 3600 * h + 60 * m + s;
        for( int i = czas; i > 0; i-- )
        {
            Sleep( 973 );
            system( "cls" );
            h = i / 3600;
            m =( i - h * 3600 ) / 60;
            s =( i - h * 3600 ) - m * 60;
            cout << "Time left: " << h << ":" << m << ":" << s;
        }
        system( "cls" );
        cout << "Press something to STOP\n";
        while( !kbhit() )
        {
            Beep( 500, 300 );
        }
        //getch();
        printf( "Press 1 to RUN program again\n" );
        if( 49 != getch() )
             break;
       
    } while( true );
   
    return 0;
}

Tylko ja tu robie coś takiego jak Ty bo getch() zwraca mi numer ASCII '1'. Jak odpalisz ten program (pomijając że jest pewnie nieoptymalnie napisany) to zobaczysz wpisując np. w miejsca h:,m:,s: 0, że przy naciśnięciu przycisku jest on wczytywany przed wyświetleniem się komunikatu printf linijki 37. A znak powinien być wczytywany dopiero po wyświetleniu się tej linijki tekstu do użytkownika.

Jeśli chodzi o logistykę programu to jest napisany zgodnie z założeniem, tylko to wczytywanie wciśniętego klawisza za wcześnie wchodzi.
P-151673
marcolo2307
» 2016-09-11 21:11:21
Google mówi, aby zflushować bufor. Możesz albo zrobić to albo odkomentować getch() po kbhit.

Masz nieużywaną zmienną a.
P-151675
« 1 »
  Strona 1 z 1