Wieder ein Sekunden-Bug Problem! Sorry!

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Cheffboss.

    Wieder ein Sekunden-Bug Problem! Sorry!

    Moin! :)
    Entschuldigung, dass ich wieder mit einem ähnlichen Problem komme.
    Ich möchte dass eine Variable mit einem Timer1 runtergezählt wird.
    Zum Beispiel von 60 Sekunden auf 0.
    Leider habe ich es bis jetzt nur geschafft, das es von 0 auf 59 Sekunden schaltet.
    Da mein Timer1 den Intervall von 1000ms hat, verstehe ich das Verhalten noch nicht richtig!
    Im Code habe ich drei Zeilen Code auskommentiert.
    Nur wenn ich diese Zeilen hinzufüge, funktioniert es so wie ich es möchte.
    Da ich aber gerne wissen möchte, warum das Programm so ausgeführt wird.
    Mein Ziel ist es ohne die Manuelle hoch Zählung des kommentierten Codes.
    Ich hoffe ich könnte mein Vorhaben genau erklären.
    Gibt es nun auch eine passende Lösung!?
    BIG THX

    VB.NET-Quellcode

    1. If intZeitProzesse = 0 Then
    2. JedeMinutePROZESSE()
    3. 'intZeitProzesse += 1
    4. End If
    5. If intZeitClipboard = 0 Then
    6. ZwischenablageFestlegen()
    7. 'intZeitClipboard += 1
    8. End If
    9. If intZeitRam = 0 Then
    10. RamWarnungFestlegen()
    11. ' intZeitRam += 1
    12. End If


    WindowsApp5.zip
    Visual Basic.NET 8o
    MS-SQL
    8o
    @Cheffboss Die Methode von slice war die richtige.

    Ich habe das ganze so umgesetzt:

    VB.NET-Quellcode

    1. Dim isFirstRun As Boolean = True
    2. #Region "Zeiten-Festlegen"
    3. Private Sub RamWarnungFestlegen()
    4. If isFirstRun Then
    5. intZeitRam = 60
    6. Else
    7. intZeitRam = 61
    8. End If
    9. End Sub
    10. Private Sub ZwischenablageFestlegen()
    11. If isFirstRun Then
    12. intZeitClipboard = 60
    13. Else
    14. intZeitClipboard = 61
    15. End If
    16. End Sub
    17. Private Sub JedeMinutePROZESSE()
    18. If isFirstRun Then
    19. intZeitProzesse = 60
    20. isFirstRun = False ' JedeMinutePROZESSE wird zuerst aufgerufen darum wird hier die variable umgestellt
    21. Else
    22. intZeitProzesse = 61
    23. End If
    24. End Sub
    25. #End Region

    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    @Cheffboss Pack doch Deine Zahl einfach in einen TimeSpan-Wert und gib den formatiert aus.
    docs.microsoft.com/de-de/dotne…timespan?view=netcore-3.1
    Feddich.
    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!
    @an beide
    Vielen Dank, für eure Hilfe. :thumbsup:
    Danke, an ClonkAndre. :thumbsup:

    Aber leider ging der Code in meinem Projekt nicht, er zeigte manchmal auf einmal 61 an.
    Ich habe das Problem nun anders lösen können.

    Der Lösungsweg:
    Einen Timer1 auf Intervall 500 stellen.
    Und als Zeitvariable ein Decimal verwenden.
    Diese dann immer 0.5 abziehen, dass entspricht dann eine Sekunde.
    Und die drei aus kommentierten Codezeilen benötige man nicht mehr...
    8o
    Bis jetzt läuft das Programm wunderbar!
    Ich werde es morgen nochmals gründlich testen, und kurz Bescheid geben!


    VB.NET-Quellcode

    1. 'Option Strict On
    2. Public Class Form1
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. RamWarnungFestlegen() : ZwischenablageFestlegen() : JedeMinutePROZESSE()
    5. End Sub
    6. Dim ZeitProzesse, ZeitClipboard, ZeitRam As Decimal
    7. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    8. ' Anzeige...
    9. Me.lblProzesseInfofeld.Text = String.Format("Prüfe Prozesse in {0} Sekunde(n)", Math.Round(ZeitProzesse))
    10. Me.lblZwischenablageInfofeld.Text = String.Format("Zwischenablage leeren in {0} Sekunde(n)", Math.Round(ZeitClipboard))
    11. Me.lblRAMInfofeld.Text = String.Format("Prüfe Arbeitspeicher in {0} Sekunde(n)", Math.Round(ZeitRam))
    12. ' Steuerung...
    13. If ZeitProzesse = 0 Then JedeMinutePROZESSE()
    14. If ZeitClipboard = 0 Then ZwischenablageFestlegen()
    15. If ZeitRam = 0 Then RamWarnungFestlegen()
    16. ' Abziehen...
    17. If Not ZeitProzesse = 0 Then ZeitProzesse -= 0.5
    18. If Not ZeitRam = 0 Then ZeitRam -= 0.5
    19. If Not ZeitClipboard = 0 Then ZeitClipboard -= 0.5
    20. End Sub
    21. #Region "Zeiten-Festlegen"
    22. Private Sub RamWarnungFestlegen()
    23. ZeitRam = 60
    24. End Sub
    25. Private Sub ZwischenablageFestlegen()
    26. ZeitClipboard = 60
    27. End Sub
    28. Private Sub JedeMinutePROZESSE()
    29. ZeitProzesse = 60
    30. End Sub
    31. #End Region
    32. Private Sub btnProzesseErinnerungBeenden_Click(sender As Object, e As EventArgs) Handles btnProzesseErinnerungBeenden.Click
    33. ' Los...
    34. ZeitProzesse = 2
    35. ZeitClipboard = 2
    36. ZeitRam = 2
    37. End Sub
    38. End Class



    edit2:
    @RodFromGermany
    Danke, werde ich morgen dann mal ausprobieren...
    Denn mir wäre es lieber wenn der Timer1 nur jede Sekunde aktiv ist.
    Visual Basic.NET 8o
    MS-SQL
    8o

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

    @RodFromGermany
    Vielen Dank, für deinen Tipp mit dem TimeSpan.
    Ich habe nun einen neuen Code geschrieben.
    In dieser der Timer1 jede Sekunde aktiv ist.
    Und nicht jede 500ms.
    Schau dir mal bitte den Code an.
    Hast du es so gemeint?
    Vielleicht könnte man die Zeile etwas verbessern.

    VB.NET-Quellcode

    1. ' TimeSpans aktualisieren...
    2. Dim timespan1 As New TimeSpan(0, 0, intZeitProzesse)

    Ich habe aber leider keine andere Lösung gefunden.
    Ist das sinnvoll jede Sekunde, den TimeSpan neu anzulegen?
    Freue mich auf Antwort!
    Nochmals Vielen Dank.

    @an alle
    Vielen Dank!



    Mein neuer Code: :thumbup:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form2
    3. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. JedeMinutePROZESSE(Einstellungen.ErsterStart)
    5. End Sub
    6. Private Enum Einstellungen As Byte
    7. BereitsGestartet = 0
    8. ErsterStart = 1
    9. End Enum
    10. Private intZeitProzesse As Integer
    11. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    12. ' TimeSpans aktualisieren...
    13. Dim timespan1 As New TimeSpan(0, 0, intZeitProzesse)
    14. ' Anzeige...
    15. Me.lblProzesseInfofeld.Text = String.Format("Prüfe Prozesse in {0} Sekunde(n)", Math.Round(timespan1.TotalSeconds))
    16. ' Steuerung...
    17. If intZeitProzesse = 0 Then
    18. Me.Timer1.Enabled = False
    19. MsgBox("Neues Fenster!")
    20. JedeMinutePROZESSE(Einstellungen.BereitsGestartet)
    21. Me.Timer1.Enabled = True
    22. End If
    23. ' Abziehen...
    24. intZeitProzesse -= 1
    25. End Sub
    26. Private Sub JedeMinutePROZESSE(blnwert As Byte)
    27. If Convert.ToBoolean(blnwert) Then intZeitProzesse = 60 Else intZeitProzesse = 61
    28. End Sub
    29. ' Debuging
    30. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    31. intZeitProzesse = 3
    32. End Sub
    33. End Class

    Visual Basic.NET 8o
    MS-SQL
    8o
    Datentypen respektieren:

    VB.NET-Quellcode

    1. Private Sub JedeMinutePROZESSE(blnwert As Einstellungen )
    2. intZeitProzesse = if(blnwert = Einstellungen.ErsterStart, 60, 61)
    3. End Sub
    Du übergibst der Methode doch ein Enum, dann soll die doch auch ein Enum erwarten.
    Und wenn sie ein Enum erwartet braucht man auch nicht diese etwas abenteuerliche Konvertierung mit Convert.ToBoolean().

    Cheffboss schrieb:

    Ist das sinnvoll jede Sekunde, den TimeSpan neu anzulegen?
    Das ist absolut kein Problem. Ob das aber die Lösung ist, weiß ich noch nicht.
    Formuliere mal aus jetziger Sicht Dein Problem erneut.
    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!