Forza la chiusura di una GUI MFC

3

Ho un processo che carica un provider UI tramite dll e un'altra risorsa di sistema che fornisce funzionalità che inoltro all'interfaccia utente tramite callback.

In alcuni casi, gli errori di risorsa sottostanti mentre l'interfaccia utente (MFC) viene visualizzata. Sono in una discussione con il responsabile dell'UI del modo appropriato di chiudere l'interfaccia utente in questi casi.

Alcuni dettagli: dal momento che fornisco i callback posso ascoltare i guasti provenienti dalla risorsa e chiamare un callback asincrono per arrestare l'interfaccia utente (o altrimenti generare un evento), o forse posso modificare i codici di ritorno dai callback per segnalare un errore che si è verificato.

Il responsabile sta insistendo (senza motivo) per cui chiudere l'interfaccia utente è una cattiva pratica. Ma per quanto posso dire, l'interfaccia utente ascolta comunque gli eventi di chiusura, da parte dell'utente e di altre fonti, quindi qual è la differenza se gli dico di chiudere?

Se questo non è completamente chiaro fammi riformulare ... Dato che hai chiamato una GUI MFC e la logica sottostante ora non è valida, qual è il modo corretto per segnalarlo di chiudere?

    
posta m_dunaevski 30.08.2016 - 01:09
fonte

1 risposta

1

Se capisco bene, intendi attuare una strategia di ripristino degli errori che chiude l'interfaccia utente se qualcosa va storto e rilanciala, sperando in un risultato migliore.

Un simile approccio anti-truffa potrebbe essere molto efficace se l'interfaccia utente fosse in un processo indipendente. Terminare la procedura utilizzando TerminateProcess() sarebbe quindi lascia che il SO pulisca il disordine e rilasci le risorse anche nelle situazioni più avverse. Questo ti permetterebbe di ricominciare, sperando che l'errore non si riproduca troppo presto.

Sfortunatamente il tuo progetto sembra basato su un provider UI in una DLL. Ciò significherebbe che l'interfaccia utente MFC viene eseguita nello stesso processo dell'applicazione e nello stesso spazio indirizzo. Quindi se l'interfaccia utente svuota qualcosa, puoi provare a terminarlo e riavviarlo, ma non hai garanzie sul corretto rilascio di tutte le risorse e tornare a una situazione stabile:

  • se l'MFC viene eseguito è un thread distinto, puoi eliminarlo se come spiegato qui . Ciò potrebbe portare a risultati soddisfacenti, ad esempio se il thread sarebbe bloccato in un ciclo infinito o così. Ma questo approccio non funzionerebbe se il thread potesse corrompere la memoria.
  • potresti anche chiudere l'interfaccia utente chiamando le funzioni di chiusura come spiegato qui o, meglio, inviando un messaggio WM_CLOSE come spiegato qui , che dovrebbe causare all'interfaccia utente di terminare il suo ciclo di eventi. Ancora una volta, questo approccio non funzionerebbe se l'interfaccia utente corrompesse la memoria o se trapelasse risorse come pennelli o altre risorse critiche di windows32.

Come vedi, nel tuo contesto questa strategia di recupero ha solo vantaggi limitati. Se hai un bug che blocca la tua interfaccia utente di tanto in tanto, ci sono possibilità che qualche memoria venga corrotta da qualche parte. Inoltre, tale ripristino degli errori è solo un modo per aggirare il problema. L'utente che sta vivendo questo tipo di riavvio sarebbe certamente felice se succedesse una volta all'anno, ma perderebbe rapidamente la fiducia se fosse ogni giorno.

Non ti sbagli nel tuo approccio, cercando di minimizzare gli effetti del bug, ma il tuo collega non ha torto, quando si aspetterebbe che il bug venga eliminato. personalmente, vorrei investire prima in quest'ultimo.

    
risposta data 19.10.2016 - 22:27
fonte

Leggi altre domande sui tag