Prozess wird beendet und wird wieder angzeigt!

  • VB.NET
  • .NET 2.0

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von asusdk.

    Prozess wird beendet und wird wieder angzeigt!

    Moin! :)
    Ich habe ein Programm, das jede Minute eine Prüfung macht.
    Zum Beispiel: Prozesse und Arbeitsspeicher!
    Sind viele Prozesse aktiv oder ist viel Arbeitsspeicher belegt.
    Dann soll der Benutzer die Möglichkeit haben, die Prozesse diese man nicht mehr benötigt zu beenden.
    In diesem Beispielprojekt habe ich leider, ein Fehler im Code.
    Denn ich bis jetzt noch nicht herausgefunden habe.
    Wenn jetzt das erste Fenster(Prozesse) angezeigt wird, und man dann den Prozess „mspaint.exe“ beendet, und wenn sich danach das zweite Fenster(Arbeitsspeicher) öffnet.
    Sieht man den Prozess „mspaint.exe“ immer noch!
    Das mit dem mspaint ist ein Beispiel, dass Programm verhält sich mit jeden Prozess gleich!
    Ich hoffe ich könnte man Problem gut beschreiben, falls nicht sagt mir Bescheid.
    Dann versuche ich es nochmals zu erklären.
    Freue mich auf Hilfe.
    BIG THX



    vb-paradise.de/index.php/Attac…0829feb026db17e2ab9ef6f3c
    Visual Basic.NET 8o
    MS-SQL
    8o

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Cheffboss“ ()

    Endlich wieder ein Post mit Rufzeichen!
    Sogar in deine Anwendungen gibst du Texte mit Rufzeichen aus!
    /Ende OffTopic

    Zum Problem!
    Eigentümlicher Workflow das!

    Cheffboss schrieb:

    Wenn jetzt das erste Fenster(Prozesse) angezeigt wird, und man dann den Prozess „mspaint.exe“ beendet, und wenn sich danach das zweite Fenster(Arbeitsspeicher) öffnet.
    Also du hast ein Fenster Prozesse, und wenn du einen beenden willst, geht ein Dialog auf - ok!
    Und wenn der Dialog geschlossen wird, gehts nicht zurück ins Fenster Prozesse, sondern ein neues Fenster poppt auf!
    Dann sind ja zwei offen! Und beim nächsten beendeten Prozess noch eins usw!

    Aber das ist auch nur ein Nebenschauplatz! Aber vlt., wenn man den Workflow bereinigt, lässt sich das eigliche Problem ja auch leichter lösen!

    Das eigliche Problem ist wohl, dass das eine Form nicht mitbekommt, wenn das andere Form etwas ändert!
    Königsweg ist, dass das andere Form eben nichts ändert! Stattdessen nur DialogResult.Ok zurückgibt, und die Änderung nimmt dann das Haupt-Form vor!
    Hallo CheffBoss!!!

    Ich muss sagen, das kommt mir grausig programmiert vor, habe es dementsprechend grausig behoben!
    Kannst du dir anschauen, solltest aber dringend das Projekt überarbeiten!

    Seit wann arbeitest du eigentlich daran? Ist ja schon eine Weile nun!
    Wo ist eigentlich der Sinn!

    Aber kannst es dir ja mal ansehen! Quick and Dirty (Sehr).
    Dateien
    • Beispiel.zip

      (71,81 kB, 9 mal heruntergeladen, zuletzt: )
    @ErfinderDesRades
    Danke, für deine Nachricht.
    Warum sind Rufzeichen! So schlimm?

    @xored
    Danke, aber leider hat mir der Code nicht geholfen
    Im Fenster das erscheint, sollen die Prozesse nicht,
    nochmals (Live) aufgelistet werden.
    Es soll der Wert vom Listview von der frmHaupt übertragen werden.

    @an alle
    Ich habe vielleicht eine Lösungsmöglichkeit gefunden.
    Die aber sehr kompliziert ist...
    In der Zeile in dieser das Fenster z.B Prozesse geöffnet wird.
    Könnte man prüfen ob in der Spalte ‚Vollständiger Pfad ‘.
    Noch der Prozess läuft! Falls nicht, diesen Wert entfernen.
    Könnte das der Lösungsweg sein?
    Falls Ja, wie kann man am besten anfangen?
    ?(

    VB.NET-Quellcode

    1. Dim neuesFenster As New frmFensterFrage(False, lvAnwendungenListe.Items)
    2. neuesFenster.Text = "Prozesse"
    3. neuesFenster.ShowDialog()
    Visual Basic.NET 8o
    MS-SQL
    8o

    Cheffboss schrieb:

    Warum sind Rufzeichen! So schlimm?
    Weil die Thread-Ersteller dann glauben, sie würden bevorzugt behandelt.
    ====
    Pack den Dialog-Aufruf in einen Using-Block:

    VB.NET-Quellcode

    1. Using neuesFenster As New frmFensterFrage(False, lvAnwendungenListe.Items)
    2. neuesFenster.Text = "Prozesse"
    3. neuesFenster.ShowDialog()
    4. End Using

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Cheffboss schrieb:

    Aber im Beitrag ist das doch noch erlaubt, oder?
    Das kannst Du halten wie Du willst.
    Ich könnte mir vorstellen, dass bei einem aufdringlichen Post einfach nicht weiter gelesen wird. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. If ProzesAktiv(WerteItems(i).SubItems(2).Text) Then
    2. ' Prozessname
    3. SubItem = .Add(System.IO.Path.GetFileName(WerteItems(i).SubItems(2).Text), weiter) : weiter += 1
    4. ' Ramauslesung
    5. SubItem.SubItems.Add("0 MB")
    6. ' Pfad zur datei
    7. SubItem.SubItems.Add(WerteItems(i).SubItems(2).Text)
    8. End If
    9. Function ProzesAktiv(wert As String) As Boolean
    10. For Each Process In System.Diagnostics.Process.GetProcesses
    11. If Process.ProcessName.Contains(System.IO.Path.GetFileNameWithoutExtension(wert)) Then
    12. Return True
    13. End If
    14. Next
    15. Return False
    16. End Function


    Ich habe es gerade auch so versucht.
    Leider erscheint mir immer wieder das Programm, das bereits
    im ersten durchgang beendet worden ist.
    Visual Basic.NET 8o
    MS-SQL
    8o
    @Cheffboss Dieser Code hat doch nix mit dem Status des Programms zu tun.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hm, ich kann nichtmal versuchen was zu machen da das Sample nicht funktioniert.


    Nachtrag Nervermind, war NET 3.5 das hab ich gar nicht mehr druff ^^ habs zum testen mal geändert
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „asusdk“ ()

    @asusdk
    Danke, für deine Antwort und deinen versuch mir zu helfen.
    Die Fehlermeldung ist komisch!

    @an alle
    Ich glaube ich könnte das Problem nun lösen.
    Wäre cool, wenn jemand von euch das mal testen kann.
    Auf meinen Windows 10 und XP System, klappt das soweit.
    Danke, an euch alle!

    VB.NET-Quellcode

    1. Public Sub NeuesFensterRAMFrageCode()
    2. Me.Timer1.Enabled = False
    3. Using neuesFenster As New frmFensterFrage(False, Me.lvAnwendungenListe.Items)
    4. neuesFenster.Text = "Arbeitspeicher"
    5. neuesFenster.ShowDialog()
    6. End Using
    7. Me.Timer1.Enabled = True
    8. ' Bug fix?
    9. Me.ListBox1.Items.Clear()
    10. Do
    11. If ListBox1.Items.Count <> 0 Then Exit Do
    12. Application.DoEvents()
    13. Loop
    14. End Sub
    15. Private Sub NeuesFensterProzesseFrageCode()
    16. Me.Timer1.Enabled = False
    17. Using neuesFenster As New frmFensterFrage(False, Me.lvAnwendungenListe.Items)
    18. neuesFenster.Text = "Prozesse"
    19. neuesFenster.ShowDialog()
    20. End Using
    21. Me.Timer1.Enabled = True
    22. ' Bug fix?
    23. Me.ListBox1.Items.Clear()
    24. Do
    25. If ListBox1.Items.Count <> 0 Then Exit Do
    26. Application.DoEvents()
    27. Loop
    28. End Sub



    edit2:
    Mir ist nun bei meinen Code was aufgefallen.
    Wenn die Listbox1 immer leert bleibt, wenn keine Inhalt drin ist.
    Wird es eine endlos Schleife.
    Irgendwie muss ich das noch verbessern.
    Aber ich glaube ich bin jetzt auf dem richtigen Lösungsweg. ?(

    VB.NET-Quellcode

    1. If ListBox1.Items.Count <> 0 Then Exit Do


    Visual Basic.NET 8o
    MS-SQL
    8o

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Cheffboss“ ()

    OT!

    Das mit die Rufzeichen ist interessant.
    Iwo in meinem Gehirn läuft die Input-Verarbeitung von Schrift und Sprache zusammen.
    Lese ich einen Satz mit ? am Ende empfinde ich quasi eine fragende Sprachmelodie.
    Und Sätze mit Rufzeichen empfinde ich als gerufen.
    Super-fett, und mit Rufzeichen!!!
    ist Geschrei.
    (Sätze in Klammern, kleinem Font und blasser Farbe murmeln so kleinlaut vor sich hin).
    @ErfinderDesRades
    Interessant, aber meine Begrüßung mit Moin! In Fett und Rufzeichen ist doch, ok hoffe ich.

    @an alle
    Leider war mein Lösungsweg den ich gestern im Auge hatte falsch.
    Da es eine Endlosschleife gibt, wenn der Benutzer alle Prozesse beendet hat(CPU:100%) .

    Ich habe nun einen neuen Lösungsweg, aber es kann auch sein, das ich mich total irre.
    Ich möchte dort, wo der String in die Listbox eingefügt wird.
    Einen Check machen, ob Prüfen ob dieser noch läuft.
    Falls nicht, möchte ich die entsprechenden Zeilen nicht hinzufügen.
    Also wenn z.B thebat.exe nicht läuft, dann sollen die beiden Zeilen nicht hinzugefügt werden.
    ("The Bat!")
    ("c:\anwendungen\the bat!\thebat.exe")
    Ich hoffe dass, dieser Versuch, ans Ziel führt.
    Danke, für eure Hilfe.



    vb-paradise.de/index.php/Attac…0829feb026db17e2ab9ef6f3c


    edit2:
    Dieser Lösungsweg war leider falsch...
    Visual Basic.NET 8o
    MS-SQL
    8o

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Cheffboss“ ()

    @Cheffboss
    Kannst du evtl. mal beschreiben was genau eigentlich dein Ziel ist, wie genau stellst du dir vor das dein programm laufen/funktionieren soll, was ist dein eigentliches Ziel ?
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    @asusdk
    OK, ich versuche es nun besser zu erklären. ^^
    Mein Programm prüft wieviel Prozesse geöffnet sind.
    Falls es viele Prozesse sind, soll ein neues Fenster erscheinen.
    In diesem man die Prozesse sieht, und diese per Klick beenden kann.
    Und die zweite Prüfung, reagiert bei einem Prozentsatz von dem Arbeitsspeicher, wenn jetzt 95% belegt sind.

    Ich habe einen Timer1 der Prüft beides(Prozesse, Arbeitsspeicher) in einem 60 Sekunden Takt.

    Wenn sich das neue Fenster öffnet, mit diesem man die nicht mehr benötigen Prozesse beenden kann.
    Um wieder mehr Arbeitsspeicher zur Verfügung zu haben.

    Nun das Problem: ;(
    Wenn ich nun Prozesse gestartet habe, und einen Prozess beende.
    Dann wird mir in diesem neuem Fenster, der alte Prozess angezeigt, dieser aber bereits beendet worden ist.
    (Siehe Bilder)
    Ich hoffe, ich habe mein vorhabe nun gut erklären können.
    BIG THX

    Beispielprojekt:
    vb-paradise.de/index.php/Attachment/50073-beispiel-zip/

    Beispielbild:

    Visual Basic.NET 8o
    MS-SQL
    8o
    Ok dann ergibt das schonmal einigermaßen Sinn für mich, im Prinzip denke ich mal eine Liste Global zu erstellen, und alle 60 sekunden zu aktualisieren, sowie auch jedes mal wenn du einen Prozess killst, wäre das zielführendste, ich schaus mir später mal an, muss allerdings zugeben das ich Forms betreffend echt extrem eingerostet bin, ich verwende seit einigen Jahren ausschließlich die WPF, die hierfür geradezu perfekt geignet wäre ^^
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Anpassung in frmFensterFrage:
    • ListViewItemCollection als Property definiert,
    • Zuweisung im Konstruktor,
    • Im btnProzesseBeenden_Click an selektierten index aus ListViewItemCollection löschen

    Quellcode

    1. Public Class frmFensterFrage
    2. Dim WerteItems As ListViewEx.ListViewItemCollection
    3. Sub New(blnValues As Boolean, werteItems As ListViewEx.ListViewItemCollection, Optional wert1 As List(Of String) = Nothing)
    4. ' Dieser Aufruf ist für den Designer erforderlich.
    5. InitializeComponent()
    6. Me.WerteItems = werteItems
    7. Dim liste As New List(Of String)
    8. For i As Integer = 0 To werteItems.Count - 1
    9. Dim SubItem As ListViewItem
    10. With Me.lvProzesse.Items
    11. If Not liste.Contains(werteItems(i).SubItems(2).Text) Then
    12. Static weiter As Integer = 0
    13. ' Prozessname
    14. SubItem = .Add(System.IO.Path.GetFileName(werteItems(i).SubItems(2).Text), weiter) : weiter += 1
    15. ' Ramauslesung
    16. SubItem.SubItems.Add("0 MB")
    17. ' Pfad zur datei
    18. SubItem.SubItems.Add(werteItems(i).SubItems(2).Text)
    19. End If
    20. liste.Add(werteItems(i).SubItems(2).Text)
    21. End With
    22. Next
    23. lvProzesse.Items(0).Selected = True
    24. End Sub
    25. Private Sub btnProzesseBeenden_Click(sender As Object, e As EventArgs) Handles btnProzesseBeenden.Click
    26. Dim strApp As String = Me.lvProzesse.Items(Me.lvProzesse.FocusedItem.Index).SubItems(0).Text
    27. If MessageBox.Show(strApp & " beenden?", "Frage", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.No _ Then Exit Sub
    28. ' Programm beenden...
    29. For Each prozess In Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(strApp))
    30. prozess.CloseMainWindow()
    31. Next
    32. Me.WerteItems.RemoveAt(Me.lvProzesse.FocusedItem.Index)
    33. Me.DialogResult = DialogResult.Yes
    34. Me.Close()
    35. End Sub
    36. End Class
    Dateien
    • beispiel.zip

      (18,31 kB, 6 mal heruntergeladen, zuletzt: )