none
Viele Timer / Zeitberechnungen (Alternativen, etc?) RRS feed

  • Frage

  • Liebe Community,

    ich programmiere derzeit einen Simulator bei dem viel mit Zeitberechnungen im Hintergrund berechnet werden muss etc.

    Nach bestimmten Zeiten passieren unterschiedliche und vorallem parallele Dinge die abgefragt werden müssen.

    Wie kann ich in WPF am besten Zeitberechnungen durchführen? Eignen sich dazu die DispatcherTimer? Oder gibts eine bessere Lösung? Nach circa 30 Minuten Spielzeit mit der Simulation laufen  im Hintergrund circa 20 Timer - parallel!

    Ich hoffe, Sie können und ihr könnt mir helfen.

    Herzlichen Dank.


    Mit freundlichen Grüße, Nevco

    Montag, 22. Februar 2016 12:53

Antworten

  • Hallo

    Mit dem zentralen Timer wäre das dann wie folgt:

    1. Der Startzeitpunkt wird dem Timer (z.B Uhrzeit und Datum) entnommen und gespeichert

    2. Der Zielzeitpunkt / die Zeitdauer wir dem Startzeitpunkt des zentralen Timers addiert und die Aufgabe / Aktion gestartet

    3. wenn der zentrale Timer den entsprrechenden Zeitpunkt erreicht hat wird die Aufgabe / aktion gestoppt

    Ich hoffe das konnte ein wenig weiterhelfen

    Gruß Jabbschy



    • Bearbeitet Jabbschy Montag, 22. Februar 2016 16:31 Rechtschreibfehler
    • Als Antwort markiert Nevco Dienstag, 23. Februar 2016 18:07
    Montag, 22. Februar 2016 14:07
  • Hallo zusammen,

    von dem was ich bisher gelesen habe plädiere auch ich für einen einzigen, zentralen Timer.

    Ich möchte zusätzlich noch das Konzept der Spielschleife aufbringen. Das ist hier vielleicht auch anwendbar. Dabei wird eine Schleife ohne Unterbrechung ausgeführt und in jeder Iteration werden die benötigten Aktionen durchgeführt. Sollten beispielsweise 2 Autos gegen einander ein Rennen fahren, wobei Auto A doppelt so schnell ist wie Auto B, dann kann man innerhalb der Schleife Auto A in jeder Iteration 1px nach vorn bewegen, Auto B dagegen nur in jeder 2. Iteration.

    Da hier auch noch die Aktualisierung der UI eine wichtige Rolle spielt, sei noch gesagt dass diese so gering wie möglich ausfallen sollte. Jeder zusätzliche Aufruf des Dispatchers benötigt sehr viel Leistung. Daher würde ich auch vom DispatcherTimer abraten, denn dieser führt den gesamten Code im Tick-Eventhandler im UI-Thread aus.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert Nevco Dienstag, 23. Februar 2016 18:07
    Montag, 22. Februar 2016 23:05
    Moderator

Alle Antworten

  • Hallo Nevco,

    beschreibe doch mal die grobe Struktur von dem Code. Wenn ich das lese, würde ich empfehlen einen zentralen Timer zu benutzen.

    Grüße, Jabbschy


    • Bearbeitet Jabbschy Montag, 22. Februar 2016 13:32
    Montag, 22. Februar 2016 13:31
  • Das ist schwer zu erklären.

    Es gibt Fahrzeuge (viele). Diese Fahrzeuge führen bestimmte Aufgaben aus. Die Aufgaben sind zeitgesteuert und Fahrzeugabhängig. Je nach Aktion etc. werden entsprechende zeitgesteuerte und fahrzeugabhängige Aufgaben bestimmten Fahrzeugen zugewiesen. Nach einer bestimmten Zeit wird eine bestimmte Aktion - welche jedes mal unterschiedlich sein kann - ausgeführt.

    Hilfreich?


    Mit freundlichen Grüße, Nevco

    Montag, 22. Februar 2016 13:43
  • Hallo Nevco,

    wie Jabbschy schon schreibt, sollte da ein zentraler Timer genügen.

    Die Fahrzeugdaten liegen ja sicher in einer Db oder ähnlichem. Hierin könntest Du z.B. das Aufgabenintervall, und die letzte Ausführung hinterlegen. Im zentralen Timer würdest Du dann zu der letzten Ausführungszeit das Ausführungsintervall addieren, und mit der/dem aktuellen Zeit/Datum vergleichen. Das ganze kommt natürlich stark auf die Menge der Fahrzeuge und die Intervallgröße an, die verarbeitet werden müssen, die wir hier aber noch nicht kennen.

    Grüße

    Roland

    Montag, 22. Februar 2016 13:54
  • Ich danke euch soweit für die Denkanstöße. Ich werde mich nochmal bei euch melden nach meiner Fahrstunde. Danke vielmals!

    Mit freundlichen Grüße, Nevco

    Montag, 22. Februar 2016 14:06
  • Hallo

    Mit dem zentralen Timer wäre das dann wie folgt:

    1. Der Startzeitpunkt wird dem Timer (z.B Uhrzeit und Datum) entnommen und gespeichert

    2. Der Zielzeitpunkt / die Zeitdauer wir dem Startzeitpunkt des zentralen Timers addiert und die Aufgabe / Aktion gestartet

    3. wenn der zentrale Timer den entsprrechenden Zeitpunkt erreicht hat wird die Aufgabe / aktion gestoppt

    Ich hoffe das konnte ein wenig weiterhelfen

    Gruß Jabbschy



    • Bearbeitet Jabbschy Montag, 22. Februar 2016 16:31 Rechtschreibfehler
    • Als Antwort markiert Nevco Dienstag, 23. Februar 2016 18:07
    Montag, 22. Februar 2016 14:07
  • Hallo zusammen,

    von dem was ich bisher gelesen habe plädiere auch ich für einen einzigen, zentralen Timer.

    Ich möchte zusätzlich noch das Konzept der Spielschleife aufbringen. Das ist hier vielleicht auch anwendbar. Dabei wird eine Schleife ohne Unterbrechung ausgeführt und in jeder Iteration werden die benötigten Aktionen durchgeführt. Sollten beispielsweise 2 Autos gegen einander ein Rennen fahren, wobei Auto A doppelt so schnell ist wie Auto B, dann kann man innerhalb der Schleife Auto A in jeder Iteration 1px nach vorn bewegen, Auto B dagegen nur in jeder 2. Iteration.

    Da hier auch noch die Aktualisierung der UI eine wichtige Rolle spielt, sei noch gesagt dass diese so gering wie möglich ausfallen sollte. Jeder zusätzliche Aufruf des Dispatchers benötigt sehr viel Leistung. Daher würde ich auch vom DispatcherTimer abraten, denn dieser führt den gesamten Code im Tick-Eventhandler im UI-Thread aus.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert Nevco Dienstag, 23. Februar 2016 18:07
    Montag, 22. Februar 2016 23:05
    Moderator