PDA

View Full Version : [c] uscita/riavvio di un programma


mto89
30-11-2008, 14:07
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?

DanieleC88
30-11-2008, 14:29
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?

mto89
30-11-2008, 20:45
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!

DanieleC88
30-11-2008, 21:56
È 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... :D

ciao ;)

mto89
01-12-2008, 08:09
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

DanieleC88
01-12-2008, 12:01
Io ti consiglierei a questo punto di usare SetConsoleCtrlHandler() (http://msdn.microsoft.com/en-us/library/ms686016(VS.85).aspx), 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 ;)

mto89
01-12-2008, 20:07
purtroppo ilproblema è l'opposto:cry:
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);

}

DanieleC88
01-12-2008, 20:28
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...