Timer Überschneidungen verhindern !

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von TVX.

    Wie 'schnell' Ticken die Timer denn und was versuchst du in etwa zu erreichen?
    Möglicherweise kannst du alle Timer durch einen Einzigen ersetzen - z.B. einen/mehrere Integers hochzählen und je nach Wert bestimmte Methoden aufrufen.
    Vllt kannst du durch eine andere Herangehnsweise auch den ein oder anderen Timer los werden. 6 Timer sind jedenfalls häufig zu viel und lassen sich vermeiden.

    lg

    TVX schrieb:

    ich habe 6 Timer
    Da hast Du wohl ein etwas verkorkstes Design.
    Beschreib dies mal
    oder
    motiviere uns, die Notwendigkeit von 6 Timern zu verstehen.
    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!
    Nein verkorkstes Design eigentlich nicht durch die 6 Timer werden 6 Listboxen angesteuert.
    jede Listbox hat ihren eigenen Timer und jeder dieser Timer ist für den Benutzer variabel einstellbar
    Ebenfalls müssen nicht alle 1 bis 6 benutzt werden sie sind alle zu und abschaltbar und das jeder zeit ! :whistling:

    ich dachte jetz das ich alle 6 Ereignisse in if Abfragen stecke die kontrollieren welche boxen an sind und jede if Abfrage
    beherbergt ein kleines sleep - das ganze dan 1 bis 6 untereinander in eine Funktion gepackt die durch die verschiedenen Timer aufgerufen wird .......oder so :whistling:

    TVX schrieb:

    oder so
    Und nun machen wir das ganze in einen einzigen Timer.
    Ich gehe mal davon aus, dass alle Timer dasselbe Intervall haben, Du kannst ja die bisherigen Timer-Routinen nacheinander aufrufen, sofern sie (einzeln) enabled sind.
    Ich sehe da keine Schwierigkeit.
    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!
    Ne er sagte ja die Timer sind vom Benutzer Variabel einstellbar. Aber dennoch geht das mit nur einem Timer der ein Interval von 1000ms hat also 1 Sek.

    Nun soll die eine Listbox alle 3 Sek eine andere all 20 Aktualisiert werden. Also in dem einem Timer eine Variable hochzählen und wenn sie entsprechenden Sekundenwert erreicht hat wird was ausgeführt

    VB.NET-Quellcode

    1. If Counter = 3 Then ListBox1Aktualisieren()
    2. If Counter = 20 Then Listbox2Aktualsieren()


    mit Checkboxen erweitert wenn man einzelne Listboxen deaktiviert haben will.
    Warum packt man diese zusammengehörigen Dinge nicht in eine Klasse?
    Den Pointer auf die Listbox, das Intervall, denn Counter, das Enabled-Flag usw. sowie eine Sub für den Timer-Tick.
    Für jede Gruppe instantiiert man diese Klasse und packt alle Instanzen in eine List.
    Im Timer-Event ruft man dann lediglich die Timer-Tick-Methode der gelisteten Instanzen auf.

    Je nach Notwendigkeit könnte man statt der Timer-Tick-Methode sogar ein eigenes Event in der Klasse unterbringen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    sag uns doch mal was die Timer genau bewirken? "Listboxen angesteuert" kann alles bedeuten.
    Und wie schon oft gesagt wurde kann man 6 Timer ganz leicht durch einen einzigen ersetzen: Zählervariablen hochzählen und anschließend mit if-Abfragen entsprechend handeln. Zählervariable ggf zurücksetzen.
    /sign.
    Schreib dir eine MultiTimer-Klasse, die einen Timer kapselt, aber in verschiedenen Intervallen Ticks raushauen kann, die auch noch von verschiedenen Abonenten abonniert werden können.
    Spannende Sache das - musste richtig Brain-Power investieren


    Ich für mein Teil würde aber gerne deine Definition wissen, von "sich überschneidenden Timern"
    Habs !

    Hab jetz einen Timer und 6 Couner , wird das eingestellte Limit erreicht stellt sich der counter wieder auf 0

    Haupt Timer läuft im 1 Sec Intervall

    habe aber noch nen kleinen Zeitversatz gemacht innerhalb dieser Sec von 5 x 2 ms ,bei mier gehts so aqber für andere könnte das zu schnell sein
    PS:es werden davon 6 volle listboxen gesteuert !

    TVX schrieb:

    späte Bindung
    Da ist iwas als Object deklariert, das solltest Du casten oder ordentlich deklarieren.
    Wie sieht denn die Deklaration aus? sender As System.Object :?:
    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!

    TVX schrieb:

    VB.NET-Quellcode

    1. Dim lstFiles As Object
    Da musst Du schon die richtige Deklaration hinschreiben: Dim lstFiles As ComboBox oder so.
    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!
    Ne - Option Strict On - lässt späte Bindung nicht zu ?(
    Dim lstFiles As Object



    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'listboxen mause event
    2. Dim iTempIndex As Integer
    3. Dim iLstIndex As Integer
    4. Dim lstFiles As Object
    5. 'Mausevent für ListBox2
    6. Private Sub FileListBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseDown
    7. If e.Button = Windows.Forms.MouseButtons.Left Then
    8. ' zu verschiebendes Item speichern
    9. iLstIndex = ListBox1.SelectedIndex
    10. Else
    11. iLstIndex = -1
    12. End If
    13. End Sub
    14. Private Sub ListBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseMove
    15. Dim sTempItem As String
    16. Dim iTempIndex As Integer
    17. If e.Button = Windows.Forms.MouseButtons.Left And lstFiles.SelectedIndex <> iLstIndex And iLstIndex > -1 Then
    18. ' aktuellen Index ermitteln
    19. iTempIndex = ListBox2.SelectedIndex
    20. ' markiertes Item zwischenspeichern
    21. sTempItem = CStr(ListBox2.Items(iTempIndex))
    22. ' zuvor geklicktes Item mit aktuellem ersetzten
    23. ListBox2.Items(iTempIndex) = ListBox2.Items(iLstIndex)
    24. ' zwischengespeichertes Item an vorige Position
    25. ListBox2.Items(iLstIndex) = sTempItem
    26. ' neuen ListIndex setzten
    27. iLstIndex = iTempIndex
    28. End If
    29. End Sub