vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Zombifenster richtig schließen 
Autor: Jabberwock_v6
Datum: 07.11.20 19:41

Hallo,

ich brauche mal wieder eure Hilfe, irgendwas habe ich wohl grundsätzlich noch nicht verstanden.
Aber ich mache das halt auch nicht täglich.

Ich habe eine Anwendung auf einen WinCE Handheld mit Barcodescanner usw.
Nach 10 Minuten ohne Eingabe wird der Benutzer ausgeloggt.
Dabei wird dann eine Login Form geladen und in den Vordergrund gebracht um den erneuten Login möglich zu machen.

Nach dem Login wird das Fenster geschlossen und es kann weiter gearbeitet werden.

Scheinbar wird dieses Loginfenster nicht ordentlich beendet und ist als Zombi immer noch aktiv.
Das habe ich auch überprüft und kann es reproduzieren, nach jedem Logout gibt es einen Zombi mehr.

So überprüfe ich ob das Fenster existiert und wenn nicht erzeuge ich es neu.
Die Überprüfung behauptet auch "False"

If frmLogin Is Nothing OrElse frmLogin.IsDisposed Then
                    frmLogin = New frm_Login
                End If
                If Not frmLogin.Visible Then
                    If frmLogin.ShowDlg() = True Then Application.Exit()
                    frmLogin.Close()
                    frmLogin.Dispose()
                    frmLogin = Nothing
                End If
Habe es auch mal so versucht aber keinen Unterschied.

 
Using frmLogin As New frm_Login
                    If frmLogin.ShowDlg() = True Then Application.Exit()
 
                End Using
Das eigentliche Problem, was dadurch entsteht ist das das BarcodeRead Event auf jedem aktivem Fenster ausgeführt wird. Das ist leider so und ich habe es mit einer Variablen die den Namen der aktiven Form prüft und das Event auf den nicht aktiven Fenstern abbricht. Nur hier ist es ja das aktive Fenster nur das es z.B. drei mal existier. Die Abarbeitung der Events scheint in der Reihenfolge der Erzeugung der Fenster zu passieren. Deshalb passiert es zuerst auf den schon beendeten (alten) Fenstern. Es soll dann etwas auf der Form geändert werden aber das scheitert mit einer "ObjectExposed" Meldung. Die kann ich zwar unterdrücken aber das löst ja das Problem nicht...

Warum werden die Fenster nicht ordentlich beendet?
Sie werden mit showDialog aufgerufen und auch beendet.

_exit gibt an ob jemand auf "btn_Beenden" gedrückt hat und sagt der aufrufenden Form das dass Programm beendet werden soll.

Public Function ShowDlg() As String
 
        Me.ShowDialog()
 
        ShowDlg = _exit
 
End Function
Weitern Code stelle ich gerne zur Verfügung
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zombifenster richtig schließen 
Autor: effeff
Datum: 08.11.20 18:56

Verstehe ich nicht. Wo hast du denn frmLogin definiert, dass Du irgendwo im Code darauf zugreifst?

Wieso fragst du ab, ob "frmLogin.ShowDlg=True" ist, wenn ShowDlg doch nur als "_exit" definiert ist?

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zombifenster richtig schließen 
Autor: Jabberwock_v6
Datum: 09.11.20 09:50

Guten Morgen,

ich bin mir nicht ganz sicher was Du meinst.

Der Code ist im FormLoad der Startform.

In der ersten Zeile wird geprüft ob die Form existiert. Beim Starten der Anwendung existiert sie natürlich noch nicht und wird deshalb in der zweiten Zeile als frmLogin von frm_Login erzeugt, oder etwa nicht?

Ach so, ich glaube jetzt sehe ich was du meinst.

Im Globalen Teil der Startform, steht
 Private frmLogin As frm_Login
                If frmLogin Is Nothing OrElse frmLogin.IsDisposed Then      
                    frmLogin = New frm_Login
                End If
 
                If Not frmLogin.Visible Then
                    If frmLogin.ShowDlg() = True Then Application.Exit()
                    frmLogin.Close()
                    frmLogin.Dispose()
                    frmLogin = Nothing
                End If
In dem Zweiten If wird sie angezeigt, falls sich noch nicht sichtbar ist Was sie aber auch zu dem Zeitpunkt eigentlich nie ist... Das Ganze soll ja auch nur verhindern das die Form mehrfach existiert.

Das ganze .Close() .Dispose() und Nothing ist nur durchs ausprobieren dort rein gekommen, macht aber auch keinen Unterschied

Die ShowDlg auf der LoginForm gibt ein Boolean zurück "_exit" je nachdem wird die Applikation beendet oder halt auch nicht. Ich glaube das hatte ich gemacht weil die die LoginForm die Applikation nicht beenden konnte und deshalb die Aufgabe an die Startform zurückgegeben wird.

Durch eine Timer auf der Startform wird dann irgendwann die LoginFrom wieder erzeugt und in den Vordergrund geholt. So das man sich erst wieder einloggen muss bevor man etwas machen kann. Und danach, also wenn der Timer die LoginForm erzeugt, gibt es scheinbar zwei und es werden mit jedem Aufruf mehr. Der Timer nutzt den gleichen Code wie in FormLoad() was ich oben beschrieben habe.


Ich denke ich werde es mal mit einer komplett leeren Form versuchen, es muss ja irgendwas auf/in der Form sein was sie am leben hält.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zombifenster richtig schließen 
Autor: Jabberwock_v6
Datum: 10.11.20 14:23

Hallo,

ich habe jetzt herausgefunden dass ich dieses Problem scheinbar bei allen Forms habe. Nicht nur beim Login, da fällt es nur als erstes auf.

Bevor ich ein Fenster lade mit .ShowDialog() frage ich ab ob das Fenster noch existiert.
Scheinbar hatte ich schon immer ein Problem damit.

Also

IF Form isNot Nothing Than Form = Nothing
Form = new From
Form.ShowDialog
Form.Dispose


Ich sehe in der Überwachung dass das Objekt Form dann auch Nothing ist.
Und selbst wenn ich nicht =Nothing mache, ist die Eigenschaft Form.IsDisposed = True

Trotzdem wird, wenn ich dann einen Barcode lese, das BarcodeRead Event auf der alten Form ausgeführt. Die nach dem Login ja eigentlich schon geschlossen wurde.
Aber da die Form ja Disposed ist kann der Barcodetext nicht in das Lable geschrieben werden.
Dies fängt ein Try ab und eigentlich wäre dann schluss und die Form würde auf eine Eingabe warten aber dann wird das Event plötzlich noch mal ausgeführt und dieses mal scheinbar auf der neu erstellten Form. Jetzt kann in das Label geschrieben werden

Der Barcodescanner der in dem Gerät verbaut ist arbeitet in einen eigenen Thread. Es ist nicht möglich aus dem BarcodeRead Event direkt auf den GUI Thread zuzugreifen um z.B. den BarcodeText auf der Form anzuzeigen. Nur mit Invoke.

Ich vermute das dieser Thread beim Schließen der Form nicht beendet wird, nur weiß ich überhaupt nicht ob und wie ich den beenden könnte. Ich erzeuge den ja gar nicht explicite.


Ich vermute Ihr werdet mir hier, mit den paar Infos, nicht viel weiterhelfen können aber vielleicht könnt Ihr mir ein paar Tipps geben was ich versuchen könnte. Oder Irgendwelche Debughilfen um das Problem genauer einzugrenzen.


Z.B. Wenn es in dem Try zum Fehler kommt heißt das ja dass der Code gerade auf der eigentlich längst geschlossenen Form abgearbeitet wird. Kann ich nicht darauf reagieren und die Form dann noch mal richtig schließen?
Dann würden es wenigstens nicht immer mehr Forms werden im laufe der Zeit.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zombifenster richtig schließen 
Autor: Kuno60
Datum: 11.11.20 01:53

Hallo,

es ist tatsächlich so, dass ein Eventhandler, der ein Ereignis von einem anderen Thread behandelt, auch nach dem Schließen des Fensters erhalten bleibt. Jedes neue öffnen des Fensters erzeugt einen neuen Eventhandler.
Ein Close oder Dispose bringt da gar nichts.

Abhilfe:
Entferne beim Schließen der Form den Eventhandler vom Barcodescanner.
Private Sub Form2_FormClosed(sender As Object, e As FormClosedEventArgs) _
  Handles Me.FormClosed
  RemoveHandler Barcodescanner.Read, AddressOf Barcodescanner_Read
End Sub


Beitrag wurde zuletzt am 11.11.20 um 02:20:44 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zombifenster richtig schließen 
Autor: Jabberwock_v6
Datum: 11.11.20 09:23

Hallo Kuno,

vielen Dank für deine Antwort. Ich habe tatsächlich gestern Abend dann auch den Fehler gefunden.
Ich habe deine Variante jetzt noch nicht ausprobiert aber vermutlich wird es auch gehen.

Es war tatsächlich der Barcodescanner.

    Private Sub frm_Login_Closing(ByVal sender As Object, ByVal e As _
      System.ComponentModel.CancelEventArgs) 
    Handles MyBase.Closing
        'Scanner wieder freigeben
        '
        If User.Hardware = "HuW" Then
            Try
                BarcodeDecodingDevice.Instance.Disable()
                BarcodeDecodingDevice.Instance.Dispose()
 
            Catch ex As Exception
 
            End Try
        Else
            bcr.Dispose()
 
        End If
 
    End Sub
Ich hatte immer nur das Disable() bisher drin. Ganz ohne gab es früher immer eine Fehler beim schließen der Form und durch das Disable() wird der Scanner abgeschaltet und die Form ließ sich beenden. Das ist schon Jahre her. Die Software wird gerade angepasst auf neue Hardware und da muss ich auch den Scanner .Dispose(en) beim schließen. Da ist mir dann gestern Abend der unterschied aufgefallen.

Trotzdem vielen Dank für deine Hilfe.

Ich wünsche Euch einen schönen Tag, meiner ist schon mal gerettet
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel