|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
|
[c] uscita/riavvio di un programma
ciao a tutti, ho un programma in c piuttosto lungo, la cui esecuione dura sui 2-3 minuti...vorrei creare se possibile un modo per mermettere all'utente di uscire dal programma in ogni momento, premendo un tasto o una combinzaione.
Avevo pensato a un getch() con tasto 'e' per uscire e un return(main) per riavviare, però ogni volta l'utente dovrebbe premere un tasto anche se non vuole uscire, mi sapete consigliare un modo per far sì che in QUALUNQUE momneto premendo un tasto possa interrompere o riavviare tutto?
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Ti ci vuole una qualche forma di handler che intercetti le pressioni dei tasti... è un programma per console o grafico? Su che sistema operativo lo stai sviluppando?
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
|
sistema windows, è a console...mi sono ricordato che per uscire posso indicare all'utene di premere la scorciatoia crtl+c.....però resta in genrale questa mia richiesta sulla possibilità di richiamare una funzione o altro SEMPRE con un tasto, senza forzare l'inserimento di un valore!
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
È un po' difficile, non mi risulta che la console di Windows ti lasci gestire degli eventi asincroni. Se è possibile, dovresti controllare periodicamente l'input e fare il tuo lavoro, poi tornare a controllare l'input, etc... Questo articolo spiega un bel po' di roba al riguardo: http://www.benryves.com/tutorials/?t=winconsole&c=all
Un altro modo sarebbe quello di fare due thread separati, uno che attende l'input o la fine del secondo thread, l'altro che lavora silenziosamente... ma forse è un po' esagerata come soluzione... ![]() ciao ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
|
signal(SIGINT,menu)
seno ho pensato a questa soluzione, in modo che la pressione di ctrl+c riporti alla funzione menu, e li mettrei le varie opzioni riuniicate
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Io ti consiglierei a questo punto di usare SetConsoleCtrlHandler(), che mi pare più appropriata. Però può essere una lama a doppio taglio: immagina che tu abbia funzione1() che viene chiamata per fare dei calcoli, li comincia ad elaborare e poi viene premuto Control+C, richiamando menu(). Da lì in poi l'utente sceglie se uscire (no problem) o continuare: ma se sceglie di continuare, funzione1() si trovava in uno stadio intermedio dei calcoli, e se richiamata ricomincerà da zero. A dirla tutta credo che semplicemente uscendo dall'handler si possa ritornare in modo indolore alla prima invocazione di funzione1(), ma se ti ho sollevato questo dubbio è perché non l'ho mai provato a fare, quindi non ne ho la certezza.
ciao ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
|
purtroppo ilproblema è l'opposto
![]() in pratica esegue la funzione richiamata dal signal, ma non permette pause in nessun modo e procede con il main....per capire provarte questo banale esempio: #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <signal.h> void menu(); int main() { signal(SIGINT,menu); printf("uno");Sleep(2000); printf("secondo");Sleep(2000); printf("terzo");Sleep(2000); printf("quarto");Sleep(2000); system("pause"); return 0; } void menu() { char lettera; system("cls");printf("ciao,scegli cosa fare"); lettera=getch();system("pause"); if(lettera=='e') exit(1); }
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Con un po' di modifiche (o correzioni, ad esempio usa getchar() anziché getch(), che non è standard), l'ho provato da qui (Linux) e funziona bene...
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:19.