Sto eseguendo il porting di un'applicazione Linux su Windows scritta in Qt. L'applicazione deve salvare alcune impostazioni prima della chiusura. Su Linux, possiamo farlo tramite gestori di segnale per SIGTERM, ecc. Come posso implementare lo stesso su Windows.Come rilevare lo spegnimento o la disconnessione di Windows in Qt
risposta
Se si utilizza il ciclo di eventi Qt, si può prendere il seguente segnale:
QCoreApplication vuoto :: aboutToQuit() [segnale]
Questo segnale viene emesso quando l'applicazione è in procinto di uscire dal ciclo principale degli eventi, ad es quando il livello del loop eventi scende a zero. Ciò può accadere dopo una chiamata a uscire() dall'interno dell'applicazione o quando gli utenti interrompono l'intera sessione desktop. Il segnale è particolarmente utile se l'applicazione deve eseguire una pulizia dell'ultimo secondo. Nota che nessuna interazione dell'utente è possibile in questo stato.
Oltre a questo, si può essere alla ricerca per i seguenti messaggi di seguito se il segnale di cui sopra non è appropriata per il caso d'uso:
WM_QUIT: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632641(v=vs.85).aspx
WM_CLOSE: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632617(v=vs.85).aspx
WM_QUERYENDSESSION : http://msdn.microsoft.com/en-US/library/windows/desktop/aa376890.aspx
WM_ENDSESSION: http://msdn.microsoft.com/en-US/library/windows/desktop/aa376889.aspx
Non so Qt. Se puoi permetterti di essere solo Windows WM_QUERYENDSESSION
e WM_ENDSESSION
i messaggi potrebbero essere la cosa giusta da fare.
penso che le altre risposte completamente perdere il punto: Quando si forza finisce un'applicazione, è come SIGKILL su Unix. Non c'è modo di gestirlo - tranne in anticipo. Ciò che intendo per gestirlo prima del tempo è assicurarsi di salvare le impostazioni ogni volta che vengono cambiate. Ovviamente è possibile ottimizzare questo comportamento, ad esempio salvare le impostazioni ogni pochi secondi se sono sporche, se si desidera ridurre al minimo il numero di accessi al disco (pensare al consumo di energia sui dispositivi mobili).
Molto di questo è gestito da QSettings
per voi. Finché usi QSettings
, otterrai un comportamento ragionevole. Se stai salvando i file da solo, usa QSaveFile
poiché tratta lo svuotamento del file e l'approssimazione della sostituzione di un file atomico, in modo da non perdere le impostazioni se l'eliminazione (terminazione forzata) avviene nel mezzo della scrittura.
Il segnale aboutToQuit
emesso da QCoreApplication
è ciò a cui si desidera reagire se si desidera eseguire semplicemente qualcosa quando l'applicazione viene chiesta di uscire. Questo equivale a gestire il messaggio WM_QUIT
, o a trattare con È altrettanto inutile gestire lo SIGTERM
su Unix. Quindi farlo in modo specifico per la piattaforma è inutile come già fa Qt per te.WM_CLOSE
in quanto si tratta di un messaggio che riceve solo Windows, e Qt lo gestisce già per te.
È inoltre possibile partecipare al processo di disconnessione/spegnimento installando un QAbstractNativeEventFilter
ed elaborando lo WM_ENDSESSION
e WM_QUERYENDSESSION
. Questo ha senso solo se vuoi sapere in anticipo che l'applicazione verrà chiusa.A meno che non si desideri interrompere esplicitamente l'arresto/disconnessione, non è necessario preoccuparsene.
Penso che potrebbe essere meglio gestire il segnale QApplication::commitDataRequest (o QGuiApplication::commitDataRequest in Qt5) anziché aboutToQuit. Basta collegare il segnale alla funzione per salvare le impostazioni.
Ecco alcune discussioni correlati: http://qt-project.org/forums/viewthread/33329
Non sapevo abouttoQuit gestisce SIGTERM su Linux, ma per quanto riguarda SIGHUP & SIGINT, SIGHUP è di solito inviata al applicazioni su Disconnetti nella Linux, è per questo che ho usato gestori di segnale (Specifico della piattaforma Qt way) su linux –
Nulla sulla domanda dice che l'applicazione viene forzatamente terminata. Menziona 'SIGTERM' che è un segnale di spegnimento aggraziato, non' SIGKILL'. – qris