Ancora ctrl c

di il
8 risposte

Ancora ctrl c

Salve a tutti
e diverso tempo che cerco di risolvere il problema della disattivazione della combinazione ctrl c.
ma haime ancora non ci sono riuscito ma ci sono quasi.
il codice sottostante ha un piccolo problema di settaggi
cioè quando viene eseguito e premo la famigerata combinazione di tasti mi esegue all'infinito la label primo.
come posso fare a risolvere il problema ?
// ctrlc.cpp : definisce il punto di ingresso dell'applicazione console.
//

#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
bool CHnd(DWORD CType);
int mysethandle();
int _tmain(int argc, _TCHAR* argv[])
{
	int a,b,c,retu;
primo:
	    retu = mysethandle();
		cout << "inserisci a : ";
	cin >> a;
	if (retu == 1) { cout << "\n";  retu = 0; goto primo; }
		cout << "inserisci b: ";
	cin >> b;
	c=a+b; 
	cout << "a+b = " << c << "\n";
	c=a-b; 
	cout << "a- b = " << c << "\n";
	return c;
}
int mysethandle()
   {
	   int prova; prova = 0;
	  if ( SetConsoleCtrlHandler((PHANDLER_ROUTINE) CHnd,TRUE)  )
	    { prova = 1; }
	  return prova;
}
bool CHnd(DWORD CType)
{
	if (CType ==CTRL_C_EVENT)
	{
		printf("hai premuto Ctrl-C !\n");
		return TRUE;
	}
	return FALSE;
}
ringrazio anticipatamente chiunque mi sappia spiegare come risolvere il problema.

8 Risposte

  • Re: Ancora ctrl c

    Per disabilitare:
    
    int disablesethandle()
    {
         if ( SetConsoleCtrlHandler(NULL,TRUE)  )
           { return 1 }
         return 0;
    }
    
    Per intercettarlo
    
    BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
    {
        printf("Intercept all ctrl-c\n");
        return FALSE;
    }
    
    int sethandle()
    {
         if ( SetConsoleCtrlHandler(HandlerRoutine,TRUE)  )
           { return 1 }
         return 0;
    }
    
    per una corretta comprensione:

  • Re: Ancora ctrl c

    Grazie per la risposta
    ho apportato le modifiche da te suggeritemi ma il loop perenne persiste.
    come posso resettare il control event una volta uscito dalla routine affinche mi permetta di riaccettre il carattere ?
    se ho capito bene il loop perenne dipende da ciò.
    ho già provato con
    signal(SIGINT, SIG_DFL); 
    ma non ha sortito nessun effetto.
  • Re: Ancora ctrl c

    
    #include "stdafx.h"
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    int de_ctrl_c(BOOL dis)
    {
         if ( SetConsoleCtrlHandler(NULL,dis)  )
           { return 1 }
         return 0;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int a ,b,c,retu;
        de_ctrl_c(TRUE);
        cout << "inserisci a : ";
        cin >> a; //ctrl-c è disabilitato
        de_ctrl_c(FALSE);
    
        cout << "inserisci b: ";
         cin >> b; //ctrl-c abilitato
    ....
    }
    
    Anche se non ho capito per niente cosa devi fare,perchè lo devi disabilitare e quant'altro.
  • Re: Ancora ctrl c

    Non funziona per 2 motivi.
    1) dovrebbe rieseguire l'istruzione precedente ma se metto la condizione per far ciò mi va in un ciclo infinito.
    2) quando riabilito il "vecchio" handle mi interrompe l'esecuzione del programma.
    istruzione
    mysethandle(FALSE);
    ma se ometto l'istruzione precedente il programma non mi fa accettare l'input successivo.
    andando direttamente alla conclusione.
    // ctrlc.cpp : definisce il punto di ingresso dell'applicazione console.
    //
    #include "stdafx.h"
    #include <iostream>
    #include <windows.h>
    using namespace std;
    int mysethandle(bool x)
    {
      if ( SetConsoleCtrlHandler(NULL,x)  )
           { return 1; }
         return 0;
    }
    	 int _tmain(int argc, _TCHAR* argv[])
    {
    	int a ,b,c,retu;
       mysethandle(TRUE);
        cout << "inserisci a : ";
        cin >> a; //ctrl-c è disabilitato
    	mysethandle(FALSE);
    	cout << "inserisci b: ";
    	cin >> b;
    	c=a+b; 
    	cout << "a+b = " << c << "\n";
    	c=a-b; 
    	cout << "a- b = " << c << "\n";
    	return c;
    }
    questo naturalmente e un programma di prova che mi servirà di esempio per la creazione di alcune funzioni di input da tastiera insomma per farla breve vorrei riscrivermi la cin.
    e come minimamiglioria avevo pensato di gestire le eccezioni.
  • Re: Ancora ctrl c

    Ma in buona sostanza cosa dovrebbe fare la cin?
  • Re: Ancora ctrl c

    Allora in buona sostanza una cin dovrebbe:
    1) dovrebbe avere un buffer auto cancellante senza che uno deva usare opzioni per cancellarlo.
    2) dovrebbe poter accettare anche i comandi quali ad esempio frecce,tasti .. etc etc restituendo un codice che poi verrebbe utilizzato infase di programmazione.
    3) una migliore gestione della correzione delle stringhe.
    4) dovrebbe bloccare la sequenza ctrl - c perchè e più facile premerla per errore rispetto a ctrl-pausa che resterebbe invariato al fine di poter bloccare il programma in caso di blocco.
    5) dovrebbe accettare tutti i tipi di dato.(ma questo lo fa già)
    6) gestendo automaticamente i limiti delle variabili di tipo numerico
    la sintassi acui avevo pensato per la mia cin sarebbe questa:
    int mycin ( tipo variabile usando i puntatori)
    la int iniziale mi servirebbe per verificare se c'è stato qualche errore esempio di errore tasto non gestito quale ad esempio i tasti windows che per ovvi motivi non posso gestire.
    in breve e questo quello che dovrebbe fare una normale routine di cin.
    hai qualche idea su come posso risolvere il problema di far rieseguire l'istruzione ?
  • Re: Ancora ctrl c

    Non puoi usare una cin per ricreare una tua cin.
    Io creerei un nuovo operatore per la cin e non una funzione mycin,certo è piu complesso ma decisamente sotto la filosofia c++.
    Dovrai leggere carattere per carattere e rielaborare i dati.
  • Re: Ancora ctrl c

    Ma io non voglio usare la cin per scrivere la mia cin.
    la vorrei riscrivere completamente d'accapo partendo dalla funzione che accetta il singolo carattere.
    so che è un lavoraccio ma le funzioni pessime secondo me vanno riscritte.
    per quanto riguarda gli operatori vanno aggiunti alle funzioni che hanno bisogno di piccole modifiche per essere adattate alle proprie necessità.
    mentre se volessi aggiungere un operatore alla cin che ha le minime caratteristiche quelle su indicate sarebbe equivalente alla riscrittura della funzione.
Devi accedere o registrarti per scrivere nel forum
8 risposte