PDA

View Full Version : [c++] Multithread e input da tastiera


DickValentine
18-06-2008, 10:33
Salve a tutti,
devi inserire nel mio programma la possibilità di fermare tutto premendo un tasto da tastiera, diciamo 'q'. Ho provato a mandare il mio codice in un 3d principale e in un secondario includere un controllo che legge l'input da tastiera. Ho tentato sia getchar che _getch ma per ragioni diverse non fungono. Purtroppo utilizzo c++ builder e quindi _getch_nolock non è in conio.h. Sapreste indicarmi soluzioni alternative? Mi dicono di utilizzare un gestore di eventi, ma non ho esperienza in tal senso.

71104
18-06-2008, 11:38
Salve a tutti,
devi inserire nel mio programma la possibilità di fermare tutto premendo un tasto da tastiera, diciamo 'q'. Ho provato a mandare il mio codice in un 3d principale e in un secondario includere un controllo che legge l'input da tastiera. Ho tentato sia getchar che _getch ma per ragioni diverse non fungono. Purtroppo utilizzo c++ builder e quindi _getch_nolock non è in conio.h. Sapreste indicarmi soluzioni alternative? Mi dicono di utilizzare un gestore di eventi, ma non ho esperienza in tal senso. lascia che il tuo programma vada in loop, quando l'utente lo vuole fermare basta che prema Ctrl+C. è una soluzione facile e comoda: non devi fare niente, non devi gestire nessuna pressione di tasti ne' scrivere alcun "gestore di eventi" (qualunque cosa sia) o cose simili.

unico aspetto negativo, non puoi usare eccezioni C++ in un programma che prevede il dispatching di eccezioni SEH, e la pressione di Ctrl+C causa un'eccezione SEH che tu non gestisci; più precisamente, in Windows è sconsigliato usare istruzioni try/catch/finally che potrebbero essere attraversate da un'eccezione SEH: gli stack frames attraversati da un'eccezione C++ devono essere completamente separati da quelli attarversati da un'eccezione SEH (infatti vale anche il viceversa, non dovresti usare __try/__except dove lanci un'eccezione C++).

DickValentine
18-06-2008, 12:09
lascia che il tuo programma vada in loop, quando l'utente lo vuole fermare basta che prema Ctrl+C. è una soluzione facile e comoda: non devi fare niente, non devi gestire nessuna pressione di tasti ne' scrivere alcun "gestore di eventi" (qualunque cosa sia) o cose simili.

unico aspetto negativo, non puoi usare eccezioni C++ in un programma che prevede il dispatching di eccezioni SEH, e la pressione di Ctrl+C causa un'eccezione SEH che tu non gestisci; più precisamente, in Windows è sconsigliato usare istruzioni try/catch/finally che potrebbero essere attraversate da un'eccezione SEH: gli stack frames attraversati da un'eccezione C++ devono essere completamente separati da quelli attarversati da un'eccezione SEH (infatti vale anche il viceversa, non dovresti usare __try/__except dove lanci un'eccezione C++).

un gestore di eventi è questo (http://msdn.microsoft.com/it-it/library/dacysss4.aspx)
cmq non mi sono spiegato perfettamente, io devo uscire da un loop ma non dall'intera applicazione.

71104
18-06-2008, 13:20
un gestore di eventi è questo (http://msdn.microsoft.com/it-it/library/dacysss4.aspx) che c'entrano le Windows Forms? hai detto che stai usando C++ (non hai specificato Managed) e hai anche parlato di conio.h.


cmq non mi sono spiegato perfettamente, io devo uscire da un loop ma non dall'intera applicazione. e allora cattura l'eccezione subito fuori dal loop, basta che lo circondi con un __try/__except.

DickValentine
20-06-2008, 11:25
e allora cattura l'eccezione subito fuori dal loop, basta che lo circondi con un __try/__except.

Avrei bisogno di catturarla anche prima che il loop finisca. Sto utilizzando c++ builder con forms vcl.