Timer, ticken nicht richtig

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von VBHunter.

    Timer, ticken nicht richtig

    Hallo,

    ich bastel an ein Spiel und komme leider nicht ganz weiter.
    Mir wurde schon sehr gut mit mein Timerproblem geholfen, mit einer Klasse. Nur bekomme ich es nicht hin die form mit der classe zu verknüpfen.

    Ich möchte bei Klick das die klasse ausgeführt wird .... Läuft !!!


    danach wenn der Timer abgelaufen ist möchte ich das die Bar, label usw verschwinden und der spieler 100 Punkte bekommt.

    so sieht es bei mir momentan aus:

    Im headbereich

    VB.NET-Quellcode

    1. Private _timers As List(Of BuildTimerObject)


    Zeit intervalle in Sek.

    VB.NET-Quellcode

    1. Private Const KLKuendigen = 10


    Load:

    VB.NET-Quellcode

    1. _timers = New List(Of BuildTimerObject)


    Klick funktion:

    VB.NET-Quellcode

    1. If MietenKleinesLagerSumme > 0 Then
    2. MessageBox.Show("Du hast kein kleines Lager.", "Information")
    3. Exit Sub
    4. End If
    5. If MessageBox.Show("Möchtest du wirklich dein kleines Lager kündigen?", "Information", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
    6. _timers.XY("Kleines Lager Kündigen " & Now.ToLongTimeString, KLKuendigen, Me.FlowPanel1)
    7. End If


    Hoffe ihr seht da durch :/


    Es ist schon Witzig, wie im anderen Thread von dir habe ich darauf hingewiesen das du es mit einem Event lösen solltest.
    ​Warum willst du das nicht? Hier ist kein einziges Wort "Event".

    ​Also: In deiner Klasse BildTimerObject erstellst du ein Event

    VB.NET-Quellcode

    1. Public Event Complete()​

    ​Dann nachdem der Timer abgelaufen ist unter Timer.Stop()

    VB.NET-Quellcode

    1. RaiseEvent Complete()​

    Und in deiner Form wo du darauf reagieren willst erstellst du dir eine Sub:

    VB.NET-Quellcode

    1. Private Sub ObjectComplete()
    2. MessageBox.Show("Object ist fertig")
    3. End Sub​

    ​Und dann Abonnierst du das Event indem du beim erstellen ein AddHandler schreibst:

    VB.NET-Quellcode

    1. Dim t = New BuildTimerObject("Fabrik " & Now.ToLongTimeString, FabrikTimeCompleteSeconds, Me.FlowPanel1)
    2. AddHandler t.Complete, AddressOf ObjectComplete
    3. _timers.Add(t)



    ​Wenn du z.b. noch Objekte aus der Klasse nach außen mitgeben willst kannst du am Event Parameter vergeben: Public Event Complete(para as blablabla)

    Grüße Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Das ist ein super Beispiel und auch endlich Mal was ich verstehe .... Danke das was ich alles gefunden habe bin ich zwischendurch auch auf das gekommen

    VB.NET-Quellcode

    1. Dim t = New BuildTimerObject("Fabrik " & Now.ToLongTimeString, FabrikTimeCompleteSeconds, Me.FlowPanel1)
    2. AddHandler t.Complete, AddressOf ObjectComplete
    3. _timers.Add(t)


    Jedenfalls so ähnlich .... Ich wäre aber nie auf den Zwischenschritt gekommen, da ich es immer von der Form versucht hab nie von der Class ...

    Mein Gedanke war immer so, ich öffne bei Klick die Class und steuere ab der pbar wenn sie 100% hat dann...
    Aber siehste ja der Gedanke war falsch

    Aber danke für die Erklärung solche Erklärung für ein Anfänger ist immer besser mit Beispielen
    Najanaja, im zweiten Link den ich dir geschrieben habe war genau so ein Beispiel drinnen.
    ​Nochmal, jetzt wo ich dir das so am Silbertablett serviere und du nur noch kopieren musst ist klar das es geht.

    ​Du musst es aber Verstehen!!!! Wenn du nicht verstehst wie der Code funktioniert und wie dieser Abläuft wirst du beim nächsten Problem wieder anstehen.
    ​Das ist ein super Beispiel und auch endlich Mal was ich verstehe

    ​Wirklich?? OK, mal sehen. Was bewirkt die Zeile AddHandler?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Also ich würde es so verstehen...

    Sie bewirkt das er in der Klasse t= build.... Die Variable Complete geöffnet wird und auf der form in der sub Objektcomplete zugegriffen wird und ausgegeben wird

    Richtig?
    Nein.
    Es bewirkt das die Prozedur ​Private Sub ObjectComplete() im Form durchlaufen wird.

    ​AddHandler t.Complete, AddressOf ObjectComplete sagt das es das Event (in der Klasse BuildTimerObject) abonniert und das die Sub 'ObjectComplete' in der Form durchlaufen werden soll wenn das Event geworfen wird. Geworfen wird das Event in der klasse BuildTimerObject ja in dem Moment wenn die Zeile ​ RaiseEvent Complete() durchlaufen wird wie zu vermuten ist (RaiseEvent = Ereigniss Auslösen).

    ​Das zeigt mir WIEDER das du den Link (Alles über Events) nicht durchgelesen hast.

    Willst du nicht??

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Doch will ich sogar sehr !!!!

    Ich nerve dich bestimmt total wa? Musst mir ja auch nicht mehr Schreiben wenn ich zu anstrengend bin, ich würde es dir nicht übel nehmen. Ich versuche nur immer in kleinen schritten für ein leihen zu verstehen.
    Momentan sitze ich auch ca. 16 Stunden nur vorm PC lese mir alles durch und versuche zu verstehen. Mein problem ist warscheinlich, ich will zu viel auf einmal. Na ja jedenfalls SORRY :huh:

    aber wie erwähnt wurde ich aus der anzeige von "Alles über Events" nicht schlau .... jetzt mit deinen Beispielen klappte es ja ganz gut, weil ich einfach sehe was zu was gehört. Weil ja mein text dahinter versteckt ist.

    was mache ich hier eigendich falsch ?

    VB.NET-Quellcode

    1. If MietenKleinesLagerSumme > 0 Then
    2. MessageBox.Show("Du hast kein kleines Lager.", "Information")
    3. Exit Sub
    4. End If


    Habe ich mehr als zwei lager passiert das ....


    habe ich Kein lager und klicke drauf passiert das ....


    alles komisch mein script ?(

    Ja und bei der anderen geschichte habe ich versucht das die Pbar, Label usw. wieder verschwinden in im Panel ... kann ich das auch mit ein event machen, und muss ich da ein neues nehmen?
    Habe probiert im "CreateCluster" unten ein "RaiseEvent Complete" ranzusetzten. Ohne erfolg

    "_timers.remove" hab ich auch Probiert will aber auch nicht so wie ich.

    VBHunter schrieb:

    Ich nerve dich bestimmt total wa?

    ​Um das geht es weniger. Du versuchst nur ohne Kenntnisse über die Grundlagen gleich eine Meisterprüfung zu bestehen. Wie soll?

    ​Momentan sitze ich auch ca. 16 Stunden nur vorm PC lese mir alles durch und versuche zu verstehen

    ​Bei den meisten sind es Jahre.

    ​was mache ich hier eigendich falsch ?

    ​Ersthaft, da kommst nicht selbst drauf? Lese den Code in Worten mal und übersetze aus dem Englischem.

    VB.NET-Quellcode

    1. ​If MietenKleinesLagerSumme > 0 Then 'Wenn MietenKleinesLager GRÖßER als 0 dann
    2. MessageBox.Show("Du hast kein kleines Lager.", "Information") 'Nachricht zeigen
    3. Exit Sub 'Das kann sowieso weg, wozu die Sub verlassen wenn dann eh nix mehr kommt?
    4. End If


    ​Also. sagst wenn er ein Lager gemietet hat dann soll die Nachricht kommen das er kein Lager hat. Wiedersprüchlich oder?
    Mit dieser Info solltest du es hinbekommen denke ich.

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Um das geht es weniger. Du versuchst nur ohne Kenntnisse über die Grundlagen gleich eine Meisterprüfung zu bestehen. Wie soll?


    Das problem ist ich hatte angefangen bin super hin gekommen, als ich dann zu denn Timern kam wollte ich nur wissen wie ich es vieleicht vereinfachen könnte (das ich nicht 1000 Timer brauch). Hast mir dazu sehr geholfen und auch neues beigebracht, jedoch heißt das auch weitere probleme beim weiterkommen da deine stufe ja ein ganzes Stück weiter ist als meine ;)

    Bei den meisten sind es Jahre.


    Ja das ist mir bewusst, will damit nur sagen das ich momentan einen großen Ergeitz hab dies zu lernen.

    Ersthaft, da kommst nicht selbst drauf? Lese den Code in Worten mal und übersetze aus dem Englischem.


    Stimmt, :D ja das ist mir auch jetzt aufgefallen bzw. im Traum eingefallen. Ich sollte so ein zeug nicht mehr kurz vorm schlafen gehen bearbeiten.....

    VB.NET-Quellcode

    1. If MietenKleinesLagerSumme < 1 Then
    1. 16 Stunden ist halt auch bissl viel. Kein Wunder wenn man da nicht mehr weiß ob man männlein oder weiblein ist.

    2. So als Tipp, wie man Programmieren lernen kann:
    Kauf dir nen Buch zum Thema. Arbeite dieses gewissenhaft durch. In den Büchern wird dir Wissen strukturiert vermittelt, so das du am Ende ne gute Grundlage hast und dir den Rest ohne weiteres selbst beibringen kannst. Das Problem ist, wenn man einfach mal los legt mit coden, dass man zu viele Themen auf einmal bearbeiten will und so evtl. wichtigen Basics übersehen werden.

    Ich hab damals 1 Jahr lang (Abends nach dem Arbeiten) ein einziges Buch durch gearbeitet, jede Seite (mehrfach) gelesen und jede verdammte Zeile Beispielcode nach programmiert und analysiert. Zusätzlich habe ich kleine Testprojekte erstellt und mein Wissen dort anzuwenden. Übrigens sind die meisten YouTube Tutorials mist, daher dort lieber erst gar nicht rein schauen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich lese die meiste Zeit hier und woanders wie man was macht, nur um zu verstehen setzte ich es sofort in die Praxis um ....
    Ich habe jetzt ca. 10 verschiedene Projekte angefangen mit Programmen, und zu guterletzt jetzt das Spiel. Weil es einfach ein Großes Projekt ist was eigendlich alles zur Programmierung beinhaltet. Das Spiel ist nicht zum verkauf oder ähnliches, es ist ein Spiel wie ich es mir vorstelle zum Testen. Es ist und bleibt immer eine Alpha.

    Ich habe mir aus Beispiel Codes und Texte selber ein Buch / Tutorial gemacht..... Gelesen, ausgeführt, abgespeichert mit notizen und dann gedruckt (z.b. Kapitel 1)

    doch Gestern hab ich mir ein Buch bestellt :) ....

    VBHunter schrieb:


    doch Gestern hab ich mir ein Buch bestellt :) ....


    Top, dann kanns ja bald richtig los gehen :)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ja ich hoffe doch :D

    mein anderes Problem:
    Ja und bei der anderen geschichte habe ich versucht das die Pbar, Label usw. wieder verschwinden in im Panel ... kann ich das auch mit ein event machen, und muss ich da ein neues nehmen?
    Habe probiert im "CreateCluster" unten ein "RaiseEvent Complete" ranzusetzten. Ohne erfolg


    habe ich auch endlich, und selbsständig gelöst.

    in meiner Class / Tick:

    VB.NET-Quellcode

    1. _progressBar.Visible = False
    2. _restTimeLabel.Visible = False
    3. fp2.Visible = False


    Jetzt wird es im Panel unsichtbar und verschwindet komplett, und das nächst laufende schiebt sich nach oben :thumbsup: Perfekt...
    Achtung VBHunter.
    Mit den Code hast du die Elemente aber nur ausgeblendet. Diese sind eeiterhin im RAM.

    Ist für dein Testen nicht weiter dragisch sag ich jetzt mal salop, aber wenn das mehre werden dann sind irgendeann mal 100e Controls im Speicher die niemand braucht.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Okay danke das ist gut zu wissen, will ich natürlich nicht das es im RAM weiterläuft .... ich mach mich da nochmal schlau "salopp"

    wollt das andere Thema nochmal anschneiden. Hab jetzt nochmal ein Timer als event gebaut, diesmal direkt in der Form statt Class.

    Mein versuch ist ich lasse eine zeit ablaufen (in meinen Bsp. 10 Sek) dann soll die Meldung kommen Stichtag.... dann soll eine 1 Minütige pause folgen und wieder neu Starten.

    so sieht es bei mir aus:

    Variable:

    VB.NET-Quellcode

    1. Dim RestlicheZeit As TimeSpan


    Load:

    VB.NET-Quellcode

    1. 'Tick_Timer Beginn
    2. Set_TickCountdown(New TimeSpan(0, 0, 10))
    3. 'Tick_Timer Ende


    Der Tick_Timer:

    VB.NET-Quellcode

    1. Sub Set_TickCountdown(ByVal Span As TimeSpan)
    2. Tick_Timer.Stop()
    3. RestlicheZeit = Span
    4. naechster_tick.Text = RestlicheZeit.ToString()
    5. Tick_Timer.Start() 'oder hier Aktivieren wenn es bei Seitenöffnen Starten soll
    6. End Sub
    7. Event Tick_Abgelaufen()
    8. Sub Abgelaufen() Handles MyClass.Tick_Abgelaufen
    9. Set_TickCountdown(New TimeSpan(0, 0, 10))
    10. Tick_Timer.Start()
    11. End Sub
    12. Private Sub Tick_Timer_Tick(sender As Object, e As EventArgs) Handles Tick_Timer.Tick
    13. RestlicheZeit -= New TimeSpan(0, 0, 1)
    14. naechster_tick.Text = RestlicheZeit.ToString()
    15. If RestlicheZeit = New TimeSpan(0) Then
    16. naechster_tick.Text = "Stichtag! Es wird jetzt eine Minute abgerechnet."
    17. Tick_Timer.Stop()
    18. RaiseEvent Tick_Abgelaufen()
    19. End


    Muss ich für die einminütige Pause ein weiteren Timer einbauen, oder geht das auch mit "Tick_Timer. YX (restart oder so)"?
    Hallo

    ​In diesem Fall bräuchtest du jetzt gar keinen Event aber es schaded auch nicht, ist sauberer mit Event, außerdem kannst du dann üben.
    Du schreibst: ​Set_TickCountdown(New TimeSpan(0, 0, 10)). Du wirst warscheinlichim lufe der Entwicklung mehrere Timer in der Form haben. Gewöhne dir deshalb eine Benamsung an die logisch ist. Set_Tickcountdown kann jeder Timer sein. Set_Stichtagcountdown klinkt schon nach mehr.

    ​In deinem Fall willst du 2 Zeitspannen warten. Einmal die 10 Sekunden und dann noch die eine Minute. Brauchst somit zwei Timer.
    ​Der erste läuft 10 Sekunden. Im Tick stoppst du diesen Timer, es kommt die Meldung das nun der Stichtag ist und startet den zweiten Timer.
    ​Im Tick des zweiten Timer stoppst du diesen und startest den ersten Timer wieder.

    ​Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    ​In deinem Fall willst du 2 Zeitspannen warten. Einmal die 10 Sekunden und dann noch die eine Minute. Brauchst somit zwei Timer.

    Das würde ich im selben Timer erledigen.
    Entweder durch Veränderung der Zeitspanne oder durch interne Counter.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo

    petaod schrieb:

    Entweder durch Veränderung der Zeitspanne oder durch interne Counter


    ​Wäre machbar, klar. Aber für Ihn als Anfänger sicher zu kompliziert und eher schwer nachzuvollziehen was da jetzt genau abgeht.
    ​So ist es einfach und sauber, vorallem weis er. welcher Timer was genau macht und kann sich vorstellen was wann passiert.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Das wird dann mal mein nächster anlauf :D

    ....
    So hab nun die Timer eingebaut so sieht es jetzt aus:

    Variable:

    VB.NET-Quellcode

    1. Dim RestlicheZeit As TimeSpan
    2. Dim RestlicheZeit1 As TimeSpan


    Load:

    VB.NET-Quellcode

    1. 'Tick_Timer Beginn
    2. Stichtag_Timer.Start()
    3. Set_StichtagTimer(New TimeSpan(0, 0, 10))
    4. Set_AbrechnungsTimer(New TimeSpan(0, 0, 20))
    5. 'Tick_Timer Ende


    Tick Sub:

    VB.NET-Quellcode

    1. Sub Set_StichtagTimer(ByVal Span As TimeSpan)
    2. RestlicheZeit = Span
    3. naechster_tick.Text = RestlicheZeit.ToString()
    4. End Sub
    5. Private Sub Stichtag_Timer_Tick(sender As Object, e As EventArgs) Handles Stichtag_Timer.Tick
    6. Label160.Text = "Zeit bis zum nächsten Stichtag"
    7. RestlicheZeit -= New TimeSpan(0, 0, 1)
    8. naechster_tick.Text = RestlicheZeit.ToString()
    9. If RestlicheZeit = New TimeSpan(0) Then
    10. Stichtag_Timer.Stop()
    11. Label160.Text = "Stichtag! Es wird jetzt eine Minute abgerechnet."
    12. Abrechnungs_Timer.Start()
    13. End If
    14. End Sub
    15. Sub Set_AbrechnungsTimer(ByVal Span As TimeSpan)
    16. RestlicheZeit1 = Span
    17. naechster_tick.Text = RestlicheZeit1.ToString()
    18. End Sub
    19. Private Sub Abrechnungs_Timer_Tick(sender As Object, e As EventArgs) Handles Abrechnungs_Timer.Tick
    20. RestlicheZeit1 -= New TimeSpan(0, 0, 1)
    21. naechster_tick.Text = RestlicheZeit1.ToString()
    22. If RestlicheZeit1 = New TimeSpan(0) Then
    23. Abrechnungs_Timer.Stop()
    24. Stichtag_Timer.Start()
    25. End If
    26. End Sub


    Komisch ist nur wenn es jetzt beide Timer durchläuft. Startet er nach dem zweiten Timer nicht von vorn, sondern rechnet ins Minus. :huh:

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

    Hallo

    Du denkst wieder in die falsche Richtung.

    Wenn du gelesen hast was ich geschrieben habe:
    Der erste läuft 10 Sekunden. Im Tick stoppst du diesen Timer, es kommt die Meldung das nun der Stichtag ist und startet den zweiten Timer.
    Im Tick des zweiten Timer stoppst du diesen und startest den ersten Timer wieder.


    Wenn ich das jetzt in einen Code ummünze (mit richtigen Benamsungen wie schon angesprochen) kommst folgendes raus:

    VB.NET-Quellcode

    1. Private TimerStichtag As Timer
    2. Private TimerWaitForStichtag As Timer
    3. Private Sub Set_StichtagTimers()
    4. TimerStichtag.Interval = New TimeSpan(0, 0, 10).TotalMilliseconds 'Der erste Timer läuft 10 Sekunden
    5. TimerWaitForStichtag.Interval = New TimeSpan(0, 1, 0).TotalMilliseconds 'Der zweite Timer läuft eine Minute
    6. AddHandler TimerStichtag.Tick, AddressOf TimerStichTag_Tick 'Handler hnzufügen
    7. AddHandler TimerWaitForStichtag.Tick, AddressOf TimerStichtagWaiting_Tick 'Handler hinzufügen
    8. TimerStichtag.Start()
    9. End Sub
    10. Private Sub TimerStichTag_Tick(sender As Object, e As EventArgs)
    11. TimerStichtag.Stop() 'Diesen Timer stoppen weil sonst würde er nach 10 Sekunden ja diese Prozedur wieder durchlaufen
    12. TimerWaitForStichtag.Start() 'Dafür den anderen starten
    13. MessageBox.Show("Stichtag! Es wird eine Minute gewartet bis Zeit weiterläuft") 'Meldung ausgeben der er gestartet wurde.
    14. End Sub
    15. Private Sub TimerStichtagWaiting_Tick(sender As Object, e As EventArgs)
    16. TimerWaitForStichtag.Stop() 'Jetzt ist die Minute um und er wird gestoppt.
    17. TimerStichtag.Start() 'Also muss nun der erste Timer wieder gestartet werden
    18. End Sub


    Grüße
    Sascha

    PS: Ich klinkt mich dann mal aus. Erstens geht's nun auch nicht mehr um das Thema im Titel und zweitens habe ich schon im anderen Thread gesagt das ich dir nicht dein Spiel mache.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##