In un'applicazione grafica eseguo i comandi di debug utilizzando l'ingresso della console. Quando viene creata la console, viene creato anche un nuovo thread per raccogliere i comandi utente che gestiscono tutto quell'input, l'applicazione grafica continua ad essere parallela. Io uso la libreria boost :: thread.È possibile interrompere l'attesa da parte di cin?
Funziona bene finora, tuttavia non ho trovato una buona soluzione per interrompere l'esecuzione di questo thread. Il filo è sempre in attesa di un input da parte dell'utente:
while(appRunning)
{
std::cin>>theUserCommand;
// ...do stuff
}
Poi, quando si conclude l'applicazione grafica, che verrà interrompere tutte le funzioni della console, in cui includo il filo:
appRunning = false;
// do some more related clean up
myListeningThread->join();
Come si può vedere la std :: cin aspetterà l'input dell'utente dopo che è stato chiamato il join. Una delle soluzioni che ho provato è creare eventi "sintetizzando sequenze di tasti", lo std :: cin otterrà qualunque valore tu invii con un INVIO, il thread terminerà bene, questa soluzione è orribile e non voglio mantenerla . Inoltre, ha funzionato in uno degli ambienti in cui è stato eseguito lo strumento, ma non riesce quando ho provato ad usarlo insieme a un'API dell'interfaccia utente. Potresti aiutarmi ragazzi come posso risolvere questo in modo corretto? Non posso davvero dire con certezza se nella documentazione del C++ c'è una funzione per fermare std :: cin in attesa di input dell'utente, e solo e continuare l'esecuzione del programma, è possibile?
EDIT: Bene, trovo che keybd_event sia un po 'fuorviante per alcuni ambienti, specificando esplicitamente il gestore di input con WriteConsoleInput che funziona correttamente.
Ci sono diverse possibilità, ma tutte sono dipendenti dal SO. Per quale sistema operativo è questo programma? – zwol
Win/VStudio9.0, ho usato il keybd_event per la soluzione che ho menzionato, non ci sono problemi se sarà dipendente dal sistema operativo. come mi consiglieresti di aggiustarlo? – notNullGothik
BTW, SetConsoleCtrlHandler non funziona davvero per me, questo finirà il processo dell'applicazione ignorando tutte le operazioni di pulizia per far terminare l'applicazione. – notNullGothik