2016-05-27 37 views
7

Mam aplikację (opartą na szablonie projektu XNA), która na początku pokazuje okno, aby użytkownik mógł zmienić niektóre ustawienia. Następnie okno zostanie zamknięte, a program będzie kontynuowany w innym oknie zarządzanym przez XNA. Niemal dokładnie 15 minut później program ulega awarii w wątku o nazwie Win32, który nie jest głównym wątkiem (ale nigdy nie został zrodzony przeze mnie) z naruszeniem dostępu.Awaria 15 minut po wyświetleniu okna

W standardowym debugerze nie ma nawet śladu stosu. Korzystanie z natywnego debuggera pokazuje tylko, że naruszenie dostępu nastąpiło w Kernel32!BaseThreadInitThunk, co jest metodą nieudokumentowaną. W tym samym czasie główny wątek wciąż wydaje się szczęśliwie wykonywać główną pętlę gry.

Należy pamiętać, że aplikacja jest czystą aplikacją C#, więc jest to dla mnie naprawdę kłopotliwe.

Po pewnym testów zorientowali się, że to się dzieje, nawet jeśli pokażę puste okno:

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

Więc usunięcie powyższe dwie linie w moim kodu sprawia, że ​​program całkowicie stabilny. Dodanie ich z powrotem gwarantuje naruszenie dostępu po 15 minutach (+ 30 sekund).

Sprawdziłem, że głównym wątkiem, który spawnuje okno, jest wątek STA. Próbowałem również ręcznie uruchomić program rozsyłający, ale to nie wydaje się pomóc (dispather wydaje się już działać) i próbowałem nawet wyłączyć dyspozytora po tym, jak pokazałem okno, również bez skutku.

Próbowałem również pokazać okno za pomocą technik wyświetlania okien w wielu wątkach opisanych w odpowiedzi this. Ale to też nie miało żadnego skutku. Próbowałem nawet uruchomić całkowicie oddzielny wątek, aby pokazać okno (używając tej samej techniki). To też nie miało wpływu.

W jaki sposób te dwa wiersze kodu powodują, że mój program ulega awarii 15 minut później? Jakiego rodzaju oczyszczenie pustego, standardowego okna może być konieczne?

+1

Och Właśnie zauważyłem, że używasz 'ShowDialog()'. Spróbuj zamiast tego użyć 'Show()'. Generalnie, WPF chce zakończyć twoją aplikację, gdy ostatnie okno/okno dialogowe WPF zostanie zamknięte. Daj mi znać, jak idziesz, są pewne sztuczki, których możesz użyć, aby nadal można było używać 'ShowDialog', ale upewnij się, że WPF nie zamknie twojej aplikacji. – MickyD

+0

Próbowałem też używać show i close (nawet pokaż i ukryj) . Nie miało to żadnego skutku. Myślę, że WPF próbuje tylko zamknąć twoją aplikację, jeśli masz instancję 'Application', która jest właścicielem okien i ma' ShutdownMode' ustawiony na 'OnLastWindowClose'. Ciekawe, jakie masz inne pomysły :) –

+0

Szczury, miałem nadzieję, że to wszystko. Pozwól, że pomyślę trochę więcej. Twój blog jest bardzo fajny. Podoba mi się Twoje zrównoważone stworzenie :) – MickyD

Odpowiedz

0

Brzmi jak problem związany z pamięcią, ponieważ nie należy prawidłowo usuwać obiektów ...