Programm schließt sich nicht vollständig

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Hatschi.

    Programm schließt sich nicht vollständig

    Moin, ich benutze die TextEffectsLib aus dem Forum hier.
    (Problem besteht aber bei jedem Code der ein Labeltext ändert)

    Das Problem ist folgendes:

    Sobald ich das Programm schließe, ganz normal über Me.Close() läuft der Prozess noch weiter im Hintergrund.
    Dies passiert aufgrund der Geschichte, dass im Code ständig der Labeltext geändert wird (so meine Vermutung)

    Mein Code sieht ungefähr so aus:

    VB.NET-Quellcode

    1. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    2. TextEffects.Move_String_Through_Text(CType(LabelLaufschrift, Object), Satz1, 75, ".")
    3. LabelLaufschrift.Text = ""
    4. TextEffects.Move_String_Through_Text(CType(LabelLaufschrift, Object), Satz2, 75, ".")
    5. LabelLaufschrift.Text = ""


    (Form_Shown deshalb da ich kein Code direkt in Formload ausführen lassen kann, da die Form erst vollständig aufgebaut werden muss und ich gerne automatisch beim Programmstart die Labels geändert haben möchte)

    Wäre über eine Lösung sehr dankbar.

    verstehe dein problem nicht genau

    Also zum schleißen verwende am besten Me.Exit()das schließt die Klasse und gibt somit dem Carbage dem Befehl zum abräumen. :thumbsup:
    Ansonsten wenn du das mit dem Load(was ich nicht verstehe) haben möchtest benutze doch einfach

    VB.NET-Quellcode

    1. Handles Form1.Loaded

    Unwesen schrieb:

    Beende das Programm mit Application.Exit

    Hatte ich bereits per Boardsuche gelesen, hat leider nicht geholfen.

    ErfinderDesRades schrieb:

    Vermeide Komponenten fragwürdiger Dritt-Anbieter


    Wieso derjenige fragwürdig sein soll, wenn der Thread immernoch besteht und Zusprüche erhalten hat, ist mir fragwürdig.
    Dennoch wie ich sagte besteht das Problem generell unabhängig wessen Code ich benutze, selbst wenn ich meinen eigenen schreibe.

    (Ger)Foley schrieb:

    Also zum schleißen verwende am besten Me.Exit()das schließt die Klasse und gibt somit dem Carbage dem Befehl zum abräumen. :thumbsup:
    Ansonsten wenn du das mit dem Load(was ich nicht verstehe) haben möchtest benutze doch einfach

    VB.NET-Quellcode

    1. Handles Form1.Loaded


    Me.Exit() und Form1.Loaded gibt es leider nicht, oder müsste ich dafür noch etwas importieren/deklarieren?
    Das mit dem Load naja, er lädt ja quasi noch alles, da schon aufzurufen das er Labels ändern soll verwirrt ihn wohl zu sehr. Denn wenn ich das in Load packe startet das Programm nicht, bzw die Form/Oberfläche.

    Hatschi schrieb:

    Wieso derjenige fragwürdig sein soll, wenn der Thread immernoch besteht und Zusprüche erhalten hat, ist mir fragwürdig.

    Naja. Eine Komponente, die verhindert, dass eine App normal schließt - wenn ich das als fragwürdig bezeichne, ist das noch nett formuliert ;)

    Aber kann natürlich auch sein, dass du die Komponente falsch verwendest.
    Da hast du natürlich recht, jedoch weiß ich nicht wo das Problem liegt.
    Mein ganzer Code ist der der oben steht (mit End Sub natürlich)
    Ich importiere die TextEffectsLib und rufe den Code eben auf.
    Sobald sich die Labels geändert haben, schließt sich das Programm auch ohne Probleme, nur in der Zeit wo es sich ändert nicht.
    Ich tät denken, dass man dann dieses sich ändern mindestens abbrechen können muß - wenn es das schon nicht von selbst mitbekommt.

    Üblicherweise würde man für sowas das IDisposable-Interface implementieren, und dann mit DingsBums.Dispose abbrechen können.

    Bei einem TextEffect-Control wäre es noch einfacher - ist doch ein Control, oder? - denn Control implementiert bereits IDisposable, und Dispose wird auch korrekt aufgerufen, dafür sorgt der Form-Designer.

    Wenn sich das Ding also nicht ordentlich aufräumt, dann ist das ein ziemlicher Bug, und der Anbieter eben fragwürdig, weiler sich offensichtlich mit Resourcenbereinigung nicht auskennt.
    Daran schließt sich dann gleich die nächste Befürchtung an: Wie siehts aus mit Memory-Leaks?
    Ein überdimensionaler oder sogar ununterbrochen ansteigender Speicherverbrauch ist typische Folge von Fehlern bei der Resourcenbereinigung.
    Stimmt :D
    Ist aber sehr unschön, kann man nicht das Beenden quasi erzwingen?
    Zum Beispiel (Achtung starker Pseudocode)

    If Me.Close() = True then
    End Form_Shown.Sub
    End if

    Sowas in der Richtung?

    @ErfinderDesRades:
    Tut mir Leid das wusste ich nicht.
    Aber komischerweise hatte ich auch ein einfachen Schreibmaschineneffekt geschrieben, wo exakt das gleiche Problem auftrat.
    Daraufhin habe ich mich der TextEffectsLib bedient in der Hoffnung, Problem gelöst.. war es dann aber wohl nicht ganz.
    Wenn es dafür wirklich keine Lösung gibt, dann werde ich eben auf den Effekt verzichten müssen.
    Ich möchte ungern dem Benutzer sagen, wann er das Programm beenden darf und wann nicht.
    Application.Exit() ist im FormClosing Event net besonders gut aufgehoben, da dieses durch die Anweisung auch aufgerufen wird = Endlosschleife.
    Mach dir nen Button rein und schreib es ins Click Event, müsste da eigentlich gehen.


    Hm. Eigenartigerweise hängt sich bei dem eben durchgeführten Test doch nix auf, hab da wohl was verwechselt.
    bei solchen problemem immer erst schauen ob alle threads beendet sind. Nämlich wenn du das Fenster schließt und es laufen noch andere Threads werden diese nicht beendet. Deshalb falls das der Fall ist würde ich eine public bool variable machen welche in den Threads abgefragt werden und im Form_Closing event dann diese auf True setzten. Dadurch sobald die Threads bemerken, dass diese True ist(programm soll beendet werden) können noch Vorgänge abgeschlossen werden und anschließend den Thread beenden. Dadurch würgst du das ganze nicht so ab.

    Und wenn alles nicht hilft mit prozess.kill^^


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Ich hab mich dazu entschieden auf den Schreibmaschineneffekt zu verzichten.
    Wäre sicherlich der beste Schnack bei jedem Programmierertreffen, wenn man erzählt man müsste sein Programm selbst im Code mit Process.kill beenden.
    Doch so schön diese Spielerei mit den Effekten ist, letzendlich ist's den Aufwand und die Zeit nicht wert.
    Warum es bei anderen funktioniert ist mir ein Rätsel, aber man muss auch nicht alles wissen.

    Danke an alle für die Hilfe. Ich lass den Thread mal offen indem ich nicht auf "Gelöst" klicke, da das Problem in gewisserweise noch besteht.