2016-05-27 36 views
7

Ho un'applicazione (basata sul modello di progetto XNA) che all'inizio mostra una finestra in modo che l'utente possa modificare alcune impostazioni. Successivamente la finestra viene chiusa e il programma continua in un'altra finestra gestita da XNA. Quasi esattamente 15 minuti dopo che il programma si blocca in un thread chiamato Win32 che non è il thread principale (ma non è mai stato generato da me) con una violazione di accesso.Crash 15 minuti dopo aver mostrato una finestra

Utilizzando il debugger standard non c'è nemmeno una traccia dello stack. Usando il debugger nativo mostra solo che la violazione di accesso si è verificata in Kernel32!BaseThreadInitThunk che è un metodo non documentato. Allo stesso tempo, il thread principale sembra essere ancora felice di eseguire il ciclo di gioco principale.

Ricordare che l'applicazione è un'applicazione di C# pura, quindi questo è davvero sconcertante.

Dopo alcuni test ho capito che questo accade anche se mostro una finestra vuota:

Window window = new Window(); 
window.ShowDialog(); 

Quindi rimuovere le suddette due righe nel mio codice rende il programma completamente stabile. Aggiungendoli indietro garantisce la violazione di accesso dopo 15 minuti (+ - 30 secondi).

Ho controllato che il thread principale, che genera la finestra, è un thread STA. Ho anche provato ad avviare manualmente il dispatcher, ma questo non sembra aiutare (sembra che il dispather sia già in esecuzione) e ho anche provato a chiudere il dispatcher dopo che ho mostrato la finestra, anche senza alcun effetto.

Ho anche provato a mostrare la finestra usando le tecniche per mostrare le finestre in più thread descritti nella risposta this. Ma anche questo non ha avuto alcun effetto. Ho anche provato a lanciare un thread completamente separato per mostrare la finestra (usando la stessa tecnica). Anche questo non ha avuto alcun effetto.

In che modo queste due righe di codice possono causare il blocco del programma 15 minuti dopo? Che tipo di pulizia di una finestra vuota, standard, potrebbe essere necessaria?

+1

Oh Ho appena notato che si sta utilizzando 'ShowDialog()'. Prova invece a usare 'Mostra()'. Generalmente WPF vuole terminare la tua app quando l'ultima finestra/finestra WPF è chiusa. Fammi sapere come vai, ci sono alcuni trucchi che puoi usare per poter usare ancora 'ShowDialog' ma assicurarti che WPF non spegni la tua app in seguito – MickyD

+0

Ho anche provato a usare show e close (anche mostrare e nascondere) . Non ha avuto effetto. Penso che WPF tenti di chiudere la tua app solo se hai un'istanza 'Application' che è il proprietario delle finestre e ha il' ShutdownMode' impostato su 'OnLastWindowClose'. Curioso di quali altre idee hai :) –

+0

Ratti, speravo che fosse così. Lasciami pensare ancora. Il tuo blog è molto bello Mi piace la tua creatura in equilibrio :) – MickyD

risposta

0

suona come un problema correlato di memoria da non disporre gli oggetti correttamente ...