| |
VB.NET - FortgeschritteneZombifenster 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 | |
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 | |
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. | |
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. | |
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. | |
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 | |
| 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 |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere Infos
|
|
|
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
|
|