konto usunięte

Temat: Błąd przy zamykaniu aplikacji

Witam

Stworzyłem aplikację na platformie .NET, która po dłuższym funkcjonowaniu zwiesza się przy wyłączeniu. Aplikacja ma postać MDI i w momencie wyłączenia przestaje odpowiadać na posunięcia użytkownika. Jeśli zmienię okno i do niego wrócę widzę tylko menu górne, i otwarte MDIChildren, które wciąż nie reagują. Żadnych komunikatów w pasku tytułu typu "Nie odpowiada" nie ma. Menedżer zadań traktuje program jak poprawnie uruchomiony.

Nie bardzo wiem, co może być nie tak. Jeśli aplikację wyłączę krótko po uruchomieniu wszystko działa jak powinno. Dopiero po dłuższym czasie dzieje się tak jak opisałem powyżej. Mam koncepcję, że się tak dziać z powodu jakiegoś zapchania pamięci. Ale nie bardzo wiem jak sprawdzić czy koncepcja jest na coś zdatna.

Z obiektów, które mogą według mnie mieć na to wpływ jest chyba tylko serialPort. Wcześniej miałem problem z wątkami, ale ten został rozwiązany.

Czy ktoś ma jakiś pomysł i zechce się nim podzielić?
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: Błąd przy zamykaniu aplikacji

Nie otwierasz czasem okien z różnych wątków?
Michał Wachowski

Michał Wachowski Dyrektor Działu
Programistów,
Architekt Systemów
IT

Temat: Błąd przy zamykaniu aplikacji

Być może problem w tym że zamykasz okno główne, a okna potomne nie są zamykane. Spróbuj na zdarzeniu FormClosing (okna MDI parent) pozamykać najpierw okna wewnętrzne:

C#:

private void CloseChildren()
{
    for (int i = this.MdiChildren.Length - 1; i >= 0; i += -1) {
        this.MdiChildren(i).Close();
    }
}


VB:

Private Sub CloseChildren()
For i As Integer = Me.MdiChildren.Length - 1 To 0 Step -1
Me.MdiChildren(i).Close()
Next
End Sub

konto usunięte

Temat: Błąd przy zamykaniu aplikacji

Piotr G.:
Nie otwierasz czasem okien z różnych wątków?

Każdy otwarty MDIChild jest wgrywany z oddzielnego assembly.

@Michale, wprowadziłem proponowany przez Ciebie kod i przetestowałem.
Mam pewne podejrzenie, że powodem tego typu zwieszeń jest zamykanie połączenia dla obiektu serialPort. Po wprowadzeniu do FormClosing odpowiedniego kodu postanowiłem sprawdzić to inaczej: zamknąłem połączenie (bez problemu, co nie zawsze się zdarza jeśli aplikacja działa długo), otworzyłem ponownie i zamknąłem aplikację. Objawy były takie same jak napisałem na początku.

Niemniej przy każdej uruchomieniu zdarzenia FormClosing połączenie jest zamykane, a za każdym razem używam serialPort.isOpen aby otworzyć/zamknąć połączenie.Mariusz Klimek edytował(a) ten post dnia 05.02.10 o godzinie 09:42



Wyślij zaproszenie do