Riavvia Gestione in MFC

 C Programming >> Programmazione C >  >> Tags >> MFC
Riavvia Gestione in MFC

Una delle nuove funzionalità disponibili in MFC in Visual Studio 2010 CTP è Gestione riavvio. Questo è stato introdotto con Windows Vista per offrire supporto per il riavvio dell'applicazione quando si verifica un arresto anomalo o quando un aggiornamento automatico deve chiudere e quindi riavviare un'applicazione.

Quando crei un nuovo progetto MFC in Visual Studio 2010, in Funzionalità avanzate pagina delle proprietà puoi specificare il livello di supporto che desideri per il gestore del riavvio.

Puoi selezionare una delle seguenti opzioni:

  • Supporta Gestione riavvio :si riavvia dopo un arresto anomalo o un aggiornamento
  • Riapri i documenti precedentemente aperti :riapre i documenti precedentemente aperti
  • Supporto per il ripristino dell'applicazione :recupera i documenti salvati automaticamente

Ci sono tre flag definiti per queste tre opzioni:

  • AFX_RESTART_MANAGER_SUPPORT_RESTART per Support Restart Manager
  • AFX_RESTART_MANAGER_SUPPORT_RESTART_ASPECTS per Riapri documenti precedentemente aperti
  • AFX_RESTART_MANAGER_SUPPORT_ALL_ASPECTS per il ripristino dell'applicazione di supporto

Questi sono definiti nell'intestazione afxwin.h.

// Restart Manager support flags
#define AFX_RESTART_MANAGER_SUPPORT_RESTART           0x01  // restart support, means application is registered via RegisterApplicationRestart
#define AFX_RESTART_MANAGER_SUPPORT_RECOVERY          0x02  // recovery support, means application is registered via RegisterApplicationRecoveryCallback
#define AFX_RESTART_MANAGER_AUTOSAVE_AT_RESTART       0x04  // auto-save support is enabled, documents will be autosaved at restart by restart manager
#define AFX_RESTART_MANAGER_AUTOSAVE_AT_INTERVAL      0x08  // auto-save support is enabled, documents will be autosaved periodically for crash recovery
#define AFX_RESTART_MANAGER_REOPEN_PREVIOUS_FILES     0x10  // reopen of previously opened documents is enabled, on restart all previous documents will be opened
#define AFX_RESTART_MANAGER_RESTORE_AUTOSAVED_FILES   0x20  // restoration of auto-saved documents is enabled, on restart user will be prompted to open auto-saved documents intead of last saved
#define AFX_RESTART_MANAGER_SUPPORT_NO_AUTOSAVE       AFX_RESTART_MANAGER_SUPPORT_RESTART | 
                                                      AFX_RESTART_MANAGER_SUPPORT_RECOVERY | 
                                                      AFX_RESTART_MANAGER_REOPEN_PREVIOUS_FILES
#define AFX_RESTART_MANAGER_SUPPORT_ALL_ASPECTS       AFX_RESTART_MANAGER_SUPPORT_NO_AUTOSAVE | 
                                                      AFX_RESTART_MANAGER_AUTOSAVE_AT_RESTART | 
                                                      AFX_RESTART_MANAGER_AUTOSAVE_AT_INTERVAL | 
                                                      AFX_RESTART_MANAGER_RESTORE_AUTOSAVED_FILES
#define AFX_RESTART_MANAGER_SUPPORT_RESTART_ASPECTS   AFX_RESTART_MANAGER_SUPPORT_RESTART | 
                                                      AFX_RESTART_MANAGER_AUTOSAVE_AT_RESTART | 
                                                      AFX_RESTART_MANAGER_REOPEN_PREVIOUS_FILES | 
                                                      AFX_RESTART_MANAGER_RESTORE_AUTOSAVED_FILES
#define AFX_RESTART_MANAGER_SUPPORT_RECOVERY_ASPECTS  AFX_RESTART_MANAGER_SUPPORT_RECOVERY | 
                                                      AFX_RESTART_MANAGER_AUTOSAVE_AT_INTERVAL | 
                                                      AFX_RESTART_MANAGER_REOPEN_PREVIOUS_FILES | 
                                                      AFX_RESTART_MANAGER_RESTORE_AUTOSAVED_FILES

L'abilitazione di questo supporto viene eseguita con una singola riga nel costruttore della classe derivata CWinAppEx.

CRecoveryDemoApp::CRecoveryDemoApp()
{
	m_bHiColorIcons = TRUE;

	// support Restart Manager
	m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_ALL_ASPECTS;

	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}

Ecco un'applicazione con il supporto completo per il riavvio abilitato. Sono presenti due documenti aperti, uno salvato (a sinistra) e uno non salvato (a destra).

Quando premo il pulsante di arresto anomalo, l'applicazione utilizza un puntatore nullo e si arresta in modo anomalo.

Ora, quando premo Ignora pulsante della finestra del rapporto sugli arresti anomali, viene visualizzata la finestra di gestione del riavvio che mi consente di Riavviare il programma .

Il gestore del riavvio tenterà di riavviare il programma e riaprire i miei documenti, cosa che fa con successo.

Tuttavia, puoi vedere che sebbene il supporto per il recupero dei documenti salvati automaticamente fosse abilitato, il secondo documento non salvato non è stato recuperato. Il motivo era che questo documento non è stato salvato automaticamente, perché l'intervallo predefinito per il salvataggio automatico è di 5 minuti e ho bloccato il programma subito dopo aver scritto nel documento. Questo intervallo predefinito può essere modificato chiamando il metodo SetAutosaveInterval() del gestore di recupero dati. Nell'esempio seguente cambio questo intervallo in un minuto.

BOOL CRecoveryDemoApp::InitInstance()
{
   // ...
   
   CDataRecoveryHandler* autohandler = AfxGetApp()->GetDataRecoveryHandler();
   autohandler->SetAutosaveInterval(60000);
   
   return TRUE;
}

Ecco un'altra istanza dell'applicazione con il primo documento salvato e il secondo non salvato direttamente, ma salvato automaticamente dopo un minuto di inattività.

Al riavvio dell'applicazione, poiché è presente un documento salvato automaticamente che può essere recuperato, viene visualizzata una nuova finestra.

Se scelgo Recupera i documenti salvati automaticamente il mio documento non salvato (ma salvato automaticamente) è stato recuperato.

Queste opzioni per riavviare l'applicazione e salvare e caricare i dati dell'applicazione (documenti) sono esposte tramite metodi virtuali nella classe CWinAppEx.

virtual void PreLoadState() {}    // called before anything is loaded
virtual void LoadCustomState() {} // called after everything is loaded
virtual void PreSaveState() {}    // called before anything is saved
virtual void SaveCustomState() {} // called after everything is saved

Puoi ignorare questi metodi nella tua applicazione per la gestione personalizzata delle operazioni di salvataggio e caricamento.

Per saperne di più su questa nuova funzionalità ti consiglio di leggere il blog del team di Visual C++.