none
Prüfen ob ein Programm noch läuft und ggf. mehrfach gestartete Anwendung/en beenden RRS feed

  • Frage

  • Hallo,

    mein Programm sieht ganz gezielt vor, dass man es mehrfach starten kann. Das muss so sein.
    Zumindest bei meinem extrem langsamen Test-Tablet mit einer CPU-Auslastung nach 100% passiert es immer wieder, dass beim Beenden die Form zwar geschlossen wird, im Task-Manager aber der Prozess noch aktiv ist.

    Ich habe mittlerweile einen ganzen Lex an Close-Anweisungen beim Beenden der Anwendung wie:

        Hallo.Close()
                                    Hilfe.Close()
                                    info.Close()
                                    Read.Close()
                                    Configuration.Close()
                                    Archiv.Close()
                                    Me.Close()
                                    Process.GetProcessesByName("MyApp")(0).Kill()

    bis hin zur brachialen Methode Kill. In 80%  der Fälle ist auch alles wie erwartet, aber da bleiben die 20% Rest die inakzeptabel sind. Als Modus für das Herunterfahren hatte ich bislang "Beim Schließen des Startformulars" eingestellt, das werde ich jetzt mal noch auf "Beim Schließen des letzten Formulars" ändern.

    Sollte das keinen Erfolg bringen würde ich gerne zur Laufzeit prüfen ob das Programm noch läuft und jeden aktiven Prozess beenden.

    Wie geht das?


    Liebe Grüße Stefan

    Mittwoch, 18. September 2019 22:24

Antworten

  • Hallo Stefan,

    die Frage nach dem "Wie?" stellte sich mir nur, da Du ja eben Probleme beim mehrfachen Starten beschreibst.

    Oder tritt das Problem auch auf, wenn Du nur eine Instanz deiner Anwendung erstellst?

    Wenn dein Prozess beim schließen der Anwendung nicht beendet wird, hängt das in den meisten Fällen an nicht freigegebenen Ressourcen. Das können irgendwelche SqlConnections, Streams, Dateioperationen, Bildverarbeitungen, ... (also letztendlich alles mögliche, auch COM Objekte) sein.

    Ich würde in der Anwendung mal so vorgehen, dass Du, wenn ein von dir genutztes Objekt eine Dispose Methode hat, diese auch nach Verwendung aufrufst. Instanzen sollen dementsprechend immer von dir entsorgt werden, wenn Du sie nicht mehr brauchst. Einfacher wäre es mit Using ..., das geht aber nicht in allen Fällen.

    Sollte dein Problem nur auftauchen, wenn Du mehr als eine Instanz deiner Anwendung startest, schau bitte mal, ob Du irgendwo mit statischen Objekten oder Eigenschaften (Shared, Module, ...) arbeitest. Falls ja, stell das entsprechend um, so dass eben keine statischen Elemente mehr verwendet werden.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert Sirius32ds Sonntag, 22. September 2019 08:55
    Sonntag, 22. September 2019 06:19
    Moderator

Alle Antworten

  • Hallo Stefan,

    zur Laufzeit welcher Instanz willst Du welche Prozesse beenden?

    Und warum?

    Du schreibst doch, dass deine Anwendung explizit mehrfach gestartet werden kann (hier aber mal die Frage, wie genau Du das gelöst hast, denn wenn Du da mit irgendwelchen ominösen Hilfskonstrukten arbeitest, kann ich mir gut vorstellen, dass deine Probleme davon kommen). Da kann und muss es dir völlig egal sein, ob da noch ein weiterer Prozess deiner Anwendung irgendwo rumgeistert.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Donnerstag, 19. September 2019 05:57
    Moderator
  • Stefan,

    ich starte einfach meine Exe ein zweites Mal. Dabei sehe ich jetzt erst mal keine ominöse Hilfskonstruktion.

    Das ganze ich auch so gewollt, da ich mit meinem Programm ein Kamerabild erhalte und dies u.a. vergrößere und noch so ein paar Veränderungen vornehme. Da es gewollt ist, ggf. zusätzlich mit einer zweiten Kamera zu arbeiten und diese Kamerabilder nicht auf dem Bildschirm zu teilen, schien es mir am einfachsten, die Exe ein zweites Mal zu starten und beide Programme unabhängig voneinander laufen zu lassen. Das funktioniert auch bestens. Pro Anwendung werden die jeweiligen Einstellungen gespeichert und man kann problemlos mit Alt + Tab zwischen den Anwendungen wechseln. Nur beim Schließen klappt es nicht immer.



    Liebe Grüße Stefan

    Samstag, 21. September 2019 19:17
  • Hallo Stefan,

    die Frage nach dem "Wie?" stellte sich mir nur, da Du ja eben Probleme beim mehrfachen Starten beschreibst.

    Oder tritt das Problem auch auf, wenn Du nur eine Instanz deiner Anwendung erstellst?

    Wenn dein Prozess beim schließen der Anwendung nicht beendet wird, hängt das in den meisten Fällen an nicht freigegebenen Ressourcen. Das können irgendwelche SqlConnections, Streams, Dateioperationen, Bildverarbeitungen, ... (also letztendlich alles mögliche, auch COM Objekte) sein.

    Ich würde in der Anwendung mal so vorgehen, dass Du, wenn ein von dir genutztes Objekt eine Dispose Methode hat, diese auch nach Verwendung aufrufst. Instanzen sollen dementsprechend immer von dir entsorgt werden, wenn Du sie nicht mehr brauchst. Einfacher wäre es mit Using ..., das geht aber nicht in allen Fällen.

    Sollte dein Problem nur auftauchen, wenn Du mehr als eine Instanz deiner Anwendung startest, schau bitte mal, ob Du irgendwo mit statischen Objekten oder Eigenschaften (Shared, Module, ...) arbeitest. Falls ja, stell das entsprechend um, so dass eben keine statischen Elemente mehr verwendet werden.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert Sirius32ds Sonntag, 22. September 2019 08:55
    Sonntag, 22. September 2019 06:19
    Moderator
  • Danke fürs Nachfragen. Tatsächlich trat das Problem nur dann auf, wenn es mehrfach gestartet wurde.
    Ich habe das nun mit einer While-Schleife gelöst.

    Liebe Grüße Stefan

    Sonntag, 22. September 2019 08:55
  • Hallo Stefan,

    was hat eine While Schleife mit dem Problem zu tun und da es ja nur bei mehreren Instanzen auftritt: Verwendest Du irgendwo statische Eigenschaften, Objekte bzw. Modules (in diesen ist dann implizit alles statisch/Shared)?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Sonntag, 22. September 2019 12:03
    Moderator
  • Hallo Stefan,

    meine Frage war, wie ich offene Prozesse schließen kann.
    Ich prüfe nun ab, ob meine Exe noch läuft, dabei ist es mir dann egal wie oft das Programm gestartet ist denn in der While-Schleife wird nun festgestellt dass es noch läuft und geschlossen. Mag nicht professionell sein aber es klappt.


    Liebe Grüße Stefan

    Sonntag, 22. September 2019 16:20