È possibile, e probabilmente dovrebbe aggiungere un gestore di uscita se il codice deve essere utilizzato da altre persone o ti vogliono solo più pulito. Nel tuo gestore di uscita puoi attivare un flag che interrompe il ciclo while()
. Il seguente codice funzionerà al 100% per questo caso d'uso ed è affidabile e multipiattaforma, ma se vuoi fare cose più complicate dovresti usare le funzioni specifiche di thread safe specifiche o qualcosa come Boost o C++ 11
Prima dichiarare due variabili globali, renderle volatili in modo che il compilatore ci costringerà sempre a leggere o scrivere il suo reale valore di memoria. Se non lo dichiariamo volatile, allora è possibile che il compilatore possa mettere il suo valore in un registro che lo renderà non funzionante. Con set volatile legge la posizione di memoria su ogni loop e funziona correttamente, anche con più thread.
volatile bool bRunning=true;
volatile bool bFinished=false;
e al posto del tuo while(1) {}
ciclo, modificarlo a questo
while(bRunning)
{
dostuff
}
bFinished=true;
Nel vostro gestore di uscita semplicemente impostare bRunning=false;
void ExitHandler()
{
bRunning=false;
while(bFinished==false) { Sleep(1); }
}
Lei non ha specificato un sistema operativo ma sembra come se fossi basato su Linux, per impostare un gestore su Linux hai bisogno di questo.
E su Windows quando si è un'app per console è la seguente.
BOOL WINAPI ConsoleHandler(DWORD CEvent)
{
switch (CEvent)
{
case CTRL_C_EVENT:
case CTRL_BREAK_EVENT:
case CTRL_CLOSE_EVENT:
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
bRunning = false;
while (bFinished == false) Sleep(1);
break;
}
return TRUE;
}
int main()
{
SetConsoleCtrlHandler(ConsoleHandler, TRUE);
while(bRunning()
{
dostuff
}
...error_handling...
}
Avviso la necessità di testare e attendere bFinished
qui. Se non lo fai su Windows, l'app potrebbe non avere il tempo di spegnersi in quanto il gestore di uscita viene chiamato da un thread specifico del sistema operativo separato. Su Linux questo non è necessario ed è necessario uscire dal gestore per continuare il thread principale.
Un'altra cosa da tenere in considerazione è che, per impostazione predefinita, Windows ti consente di spegnere ~ 5 secondi prima che termini. Ciò è sfortunato in molti casi e, se è necessario più tempo, è necessario modificare le impostazioni del registro (cattiva idea) o implementare un servizio che si adatti meglio a tali cose. Per il tuo caso semplice andrà bene.
L'ho lasciato così com'è e suppongo che OS debba occuparsene? – buggy3
In questo caso, desidero collegare il segnale di terminazione e utilizzarlo per uscire in modo pulito dal programma. In generale, tuttavia, per il codice che non viene mai eseguito, eliminarlo. Lascia che il controllo della tua versione tenga traccia del vecchio codice morto. – Niall
La tua domanda su come gestire la chiusura del socket o cosa fare con il codice stesso? – rhughes