Thread::Sleep zeit immer noch zu groß



  • Hallo erstma,

    ich habe mit Thread::Sleep(milisekunden) einen Thread von mir verzögert. Nun ist es so, dass es zu viel Verzögerung ist... man kann aber nur int-werte eingeben und da ist das kleinste 1 (bei 0 bleibt sleep stehen!).

    Aber mit 1 ist mein programm zu langsam, wenn ich aber kein Sleep einbaue ist es viel zu schnell.
    Hat jemand ne Lösung parat?



  • Was ist das denn für ein Programm?



  • Sleep(1) erzeugt i.d.R. eine Verzögerung von 5-12 ms (je nach verwendeter HAL.DLL).
    Du musst eins Wissen: Windows ist *kein* Echtzeitbetriebssystem! Somit wirst Du zuverlässig solche Werte nie erreichen....

    Was willst Du überhaupt machen?



  • Ich habe eine Simulation in der ein Planet um 2 Sonnen kreist, nun soll das ganze nicht ZACK und Ende und man hat nix gesehn sein, sondern mit Verzögerung.

    Ich habe eine Schleife, die immer den nächsten Wert (x,y) des Planeten ausrechnet und zeichnet. Das geht aber viel zu schnell und man kann es nicht beobachten. Ich wollte das ganze mit Sleep drosseln. Aber er drosselt zuviel: auf niedrigster Stufe (also 1 milisek) dauert das ganze so lange, dass man sich schon langweilt weil zwar was passiert, aber eben zu langsam...



  • Völlig falsche Vorgehensweise 🙂

    Nen besserer Vorschlag:
    Die Koordinaten wo der Planet gezeichnet wird, speicherst du dir in ner Variablen.
    Du hängst dich an das PaintEvent von woimmer du auch drauf zeichnest und dortdrin zeichnest du deinen Planeten immer an die Koordinaten die in der Variablen gespeichert ist. So stellst du schonmal sicher das immer die aktuelle Position gezeichnet wird.

    Dann startest am Anfang deiner Simulation nen Timer, und bei jedem Tick rufst du deine Funktion zur Berechnung der Position auf und weißt der Variablen die neue Position zu. Das wars schon. Über das Timerintervall kannst du die Geschwindigkeit steuern wie oft die Position geändert wird.



  • aber (im mom) wird die Bahn des Planeten gezeichnet (später vllt verschiebe ich den Planeten) 😃



  • Und? Dann hast du halt nicht nur eine Koordinatenvariable, sondern halt noch ne Liste von alten Koordinatenvariablen die die Bahn darstellen.



  • nein, ich habe immer nur die neueste variable, die anderen sind schon gezeichnet und damit abgehackt... ^^ aber die is auch nicht in Paint



  • </Exit> schrieb:

    die anderen sind schon gezeichnet und damit abgehackt... ^^

    Nein, glaub ich eher nicht 😉 Verschieb dein Fenster mal oder sowas ähnliches, dann siehst du dass nach deiner Methode(einmal gezeichnet und dann sein lassen) nicht viel von übrig bleibt. Zeichnen solltest du immer im Paint, nirgends anders.



  • ja ich weiß das, aber hast du ne Ahnung wie viele *kleine* Punkte so ne Bahnkurve hat? Wenn ich die alle speichere dann gibts irgendwo nen Crash, v.a. weil es sogenanntes Chaos-Verhalten gibt, bei denen der Planet immer was neues macht, aber nie abhaut oder in die Sonnen stürzt...

    von daher ist der Speicheraufwand zu groß und löschen kann ich die Bahnkurve dann auch nicht so einfach (im Moment über Refresh() ^^)



  • </Exit> schrieb:

    Wenn ich die alle speichere dann gibts irgendwo nen Crash, v.a. weil es sogenanntes Chaos-Verhalten gibt, bei denen der Planet immer was neues macht, aber nie abhaut oder in die Sonnen stürzt...

    was hat denn das speichern der Punkte der Bahnkurve mit dem Verhalten der Simulation zu tun. Simulation und Visualisierung der Ergebnisse sind doch zwei völlig verschiedene Punkte.

    von daher ist der Speicheraufwand zu groß und löschen kann ich die Bahnkurve dann auch nicht so einfach (im Moment über Refresh() ^^)

    *rofl* Nehmen wir mal an du beschreibst nen Punkt auf der Bahn durch 2 int Werte, sind 8 Byte, okay nehmen wir noch Overhead rein und sagen wir der Punkt lässt sich mit 12 Byte beschreiben. Dann nehmen wir mal 100000 Punkte und erhalten knapp 1,1 MB - wo bitte ist das viel Speicher?!? Löschen der Bahn ist leichter als alles andere indem du einfach die Punkte aus der Liste der Bahnkurve löscht. Ich weiß, ist ein wenig arg naive Rechnung, trotzdem sieht man das dein Argument vom Speicherverbrauch falsch ist - da selbst die von mir angenommenen 100000 Punkte arg viel für ne Bahnkurve sind, weil man soviel gar net sinnvoll zeichnen kann auf nem normalen Bildschirm.

    Also dein Vorgehen mag für dich irgendwie funktioniere, technisch ist der aber vollkommener Murks.



  • na gut, nach deiner Rechnung seh ich es ein, aber deine Art des Löschens hab ich nicht gepeilt... ^^



  • Ich zeig dir mal in Pseudocode wie ich des meine...

    Position aktPlanetenPosition;
    List<Position>Bahnpunkte;
    .
    Paint(...) {
      zeichnePlanetenPosition();
      foreach(Position p in Bahnpunkte) {
        zeichneBahnpunkt(p);
      }
    }
    .
    zeichnePlanetenPosition() {
      // zeichne Planeten an der Position aktPlanetenPosition
    }
    .
    zeichneBahnpunkt(Position Bahnpunkt) {
      // Punkt zeichnen
    }
    .
    simulate() {
      Bahnpunkte.Add(aktPlanetenPosition);
      aktPlanetenPosition = BerechneNeuePosition(aktPlanetenPosition);
      // mit Invalidate neuzeichnen erzwingen
    }
    .
    clearBahnPunkte() {
      Bahnpunkte.Clear();
    }
    

    Die Simulate rufst du durch nen Timer im gewünschten Intervall auf und schon wird alles automatisch immer gezeichnet. Indem du einfach die Liste der Bahnpunkte löscht, wird erreicht dass keine Bahn mehr gezeichnet.



  • aso, du spaltest das auf... bei mir wird (im Mom) der punkt ausgerechnet UND gezeichnet.

    Noch ne Frage, eigentlich (ist auch im Mom so) soll auf Knopfdruck, das passieren, aber du rufst das doch über Paint auf... Damit wirds doch immer gemacht, wenn das Fenster neu gezeichnet wird.



  • Ja dann machst halt sowas.

    bool zeichnePlanet;
    .
    Paint(...) {
      if(zeichnePlanet) {
        zeichnePlanetenPosition();
        foreach(Position p in Bahnpunkte) {
          zeichneBahnpunkt(p);
        }
      }
    }
    

    Über die boolsche Variable steuerst du ob gezeichnet werden soll oder nicht.



  • also mal thx, ich werd sehn wie ich es umsetze... thx


Anmelden zum Antworten