Zamykanie lub kontynuowanie programu po wciśnięciu przycisku.
Ostatnio zmodyfikowano 2016-09-11 21:11
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". while( !kbhit() ) { Beep( 500, 300 ); }
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()? |
|
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. |
|
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? |
|
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). 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. |
|
Tomal Temat założony przez niniejszego użytkownika |
» 2016-09-11 20:08:16 #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 ); } 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. |
|
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. |
|
« 1 » |