C# Wert Außerhalb Der Laufzeit ändern?
#1
geschrieben 30. August 2010 - 12:22
ist es möglich, einen Wert außerhalb der Laufzeit kontinuirlich zu ändern?
d. h. ich habe z. B. 100. Diese 100 soll sich allerdings alle z. B. 5min um 1 veringern.
Mithilfe von "Timern" kann man so etwas ja leicht realisieren. Allerdings ja nur solange das Programm läuft.
Der Wert, der gerade aktuell ist wird übringens in eine Datei geschrieben und auch immer wieder neu ausgelesen (Speichern / Laden).
Ich habe da schon an sowas gedacht wie; er merkt sich die Zeit und rechnet beim nächsten Programmstart die vergangene Zeit aus und zieht den entsprechenden Wert aufeinmal ab.
d. h. ich brauche den Wet nur, während das Programm läuft. Allerdings sollte er sich "theoretisch" edauerhaft verringern.
Ist das soweit verständlich was ich meine ?
Ich hoffe ihr könnt mir Helfen, schonmal Vielen Dank.
Gruß marco
Anzeige
#2
geschrieben 30. August 2010 - 12:41
Zitat
Anscheinend willst Du so was wie einen Countdown realisieren. Merk Dir doch einfach den Ausgangswert, den Startzeitpunkt und das Intervall. Das liest Du beim Programmstart ein und kannst dann bequem den aktuellen Wert ausrechnen. Vielleicht beschreibst Du Dein Vorhaben etwas genauer. Warum kann das Programm z.B. nicht einfach durchlaufen?
Dieser Beitrag wurde von Mr. Floppy bearbeitet: 30. August 2010 - 12:43
#3
geschrieben 30. August 2010 - 12:58
Ausgangswert: 100
Startzeitpunkt: Ab Jetzt
Intervall: alle 5 min 1 Punkt weniger.
Dauer: in der Regel mehrere Tage... (da der Wert zu laufzeiten wieder erhöht wird)
Wie gehe ich denn jetzt programiertechnisch vor? Das Programm soll sich also die Zeit merken, wann es beendet wird und beim start die differenz nehmen und ausrechnet wo der Wert jetzt steht? Das klingt zumind. schonmal logisch. Allerdings wüsste ich jetzt nicht ganz, wie ich das umsetzten sollte.
Zitat
Das ist nicht möglich, da man sonst den PC rund um die Uhr anlassen müsste
Dieser Beitrag wurde von driv3r bearbeitet: 30. August 2010 - 13:00
#4
geschrieben 30. August 2010 - 13:23
Ausgangswert: 100 Startzeitpunkt: konkrete Uhrzeit + Datum Intervall: 300 Sekunden (:= 5 min) Differenz: -1
Die Datei könnte so aussehen (leicht zu parsen):
100,1283170878,300,-1
Die Startzeit würde ich in Sekunden seit 01.01.1970 speichern. Das ist das übliche Format. Beim Start des Programms wird die Datei eingelesen. Jetzt muß man nur noch zurückrechnen:
Ausgangswert + Differenz * (aktuelle Zeit - Startzeit)/Intervall // auf die Einheiten achten und richtig runden!
Wie man das in C# umsetzt, kann ich Dir auch nicht sagen. Eine Zeile aus einer Datei zu lesen, dürfte aber nicht das Problem sein. Zur Not wird der Inhalt beim Start als Parameter ins Programm gepiped.
EDIT:
Zitat
Dieser Beitrag wurde von Mr. Floppy bearbeitet: 30. August 2010 - 13:41
#5
geschrieben 30. August 2010 - 13:41
Da ich bisher nur sehr wenig mit Zeit und Datum innerhalb von c# gearbeitet habe, weiß ich leider nicht genau wie ich diese Methode jetzt aufbauen soll.
Könntest du mir vllt mal ein Beispiel zeigen?
Was das auslesen bzw. schreiben in die Datei angeht, ist kein Problem. Dafür reicht mir ein readline(wert) bzw. writeline(wert) (so heißen meine Methoden nämlich)
Danke schonmal =)
#6
geschrieben 30. August 2010 - 13:52
So wie ich das verstanden habe, willst Du einen Wecker stellen, wobei man im nachhinein noch etwas ändern kann (den aktuellen Wert, was auch immer das ist). Wenn die Zeit abgelaufen ist, soll irgendwas passieren.
Du startest den Wecker also, indem Du einen Timer setzt und die genannte Datei anlegst. Letzteres, um einen Neustart zu überleben. Beim Programmstart wird die Datei eingelesen und wieder ein Timer gesetzt. Wenn der Timer abläuft, passiert irgendwas. Je nachdem wie eine nachträgliche Änderung des Ausgangs- bzw. aktuellen Wertes aussieht, überschreibt man einfach die Datei mit den neuen Werten.
#7
geschrieben 30. August 2010 - 13:59
long nowSekunden = DateTime.UtcNow.Ticks / 10000000;
Ergibt Sekunden die seit dem 1. Januar 1, 00:00:00 vergangen sind.
erste Verwendung(1x gespeichert)
oder
letzte Verwendung(letzte Speicherung)
Dann kannst du doch immer ausrechnen wieviel Zeit seit erste/letzte Verwendung vergangen ist.
UtcNow ist optimal, weil du dann kein Problem mit der Sommerzeit hast.
Gruß
Spiderman
Dieser Beitrag wurde von Spiderman bearbeitet: 30. August 2010 - 14:03
#8
geschrieben 30. August 2010 - 14:05
Nehmen wir daher mal forlgendes Beispiel:
Ich habe ein Fass mit 100L Wasser. In diesem ist unten ein Loch wo z. B. 500ml / min. rauslaufen. (immer Regelmäßig).
Jetzt starte ich das Programm nach einigen Stunden und klicke auf: "ein Eimer mit 10L Wasser in das Fass gießen. Was habe ich davon? Es dauert länger bis es leer wird. Ziel: Es darf nicht leer werden. Also muss ich das Programm jedesmal wieder starten und das Fass auffüllen beovr es leer wird. Eine Statusanzeige ect.. habe ich schon alles.
Dieses Beispiel ist eig. exakt das gleiche Prinzip wie das was ich brauche.
@Spiderman: Wie rechent man so etwas denn mit c# genau aus?
#9
geschrieben 30. August 2010 - 14:11
Zitat
Spiderman hat recht, man muß nur den Endzeitpunkt speichern. Die stetig schwindende Menge an Wasser kann man auch als Zeit ausdrücken. Wenn man 10 l dazu tut, gewinnt man wieder etwas an Zeit und das packt man auf den letzten Wert drauf. Wieder mal zu kompliziert gedacht.
Dieser Beitrag wurde von Mr. Floppy bearbeitet: 30. August 2010 - 14:18
#10
geschrieben 30. August 2010 - 14:18
Ist das denn nötig den timer neuzustarten? Ich kann doch einfach den Aktuellen Wert auslesen und dazuaddieren und wieder neu einlesen. Der Timer hohlt sich nachdem intervall ja den Wert wieder aus der Datei und zieht eben ein teil wieder ab. Da kann der Timer doch theoretisch immer an bleiben oder? Ledigtlich beim Start des programmes muss er ja neugestartet werden und eben die verpassten werte neu errechnen. Ist nur noch die Frage wie das ganze in C# auszusehen hat.
#11
geschrieben 30. August 2010 - 14:21
- wenn erster Start(kein Wert gespeichert), dann speichere Wert
- wenn gespeicherter Wert vorhanden, dann rechne (Aktuelle Zeit - gespeicherte Zeit)
- wenn das Ergebnis zu groß(Spiel verloren/zu spät), sonst Restlaufzeit oder neu laden
Gruß
Spiderman
#12
geschrieben 30. August 2010 - 14:23
#13
geschrieben 30. August 2010 - 14:23
Ich meinte wie man soetwas in C# schreibt? Ich brauche die Synax ect...
#14
geschrieben 30. August 2010 - 14:37
#15
geschrieben 02. September 2010 - 13:18
Kann es sein, das es zu viele Rescourcen verbraucht?
Die aktuellen Sek. werden erfolg. in die Datei geschrieben. Beim nächsten Start verbraucht das Programm ca. 258mb Ram (sonst 26mb), CPU im Durchschnitt 25% und nach ca. 40 Sek. stürtzt das Programm ab. (im Debugg Modus) Fehler im Code werden keine Angezeigt. Er zeigt an es wäre ein Parameter falsch bem Anzeigen eines Bildes (geht sonst immer). Das Bild hat damit eig. nichts zu tun.
Kommentiere ich die Methode mit // aus, funktioniert alles wieder einwandfrei.
Woran könnte das liegen? Wenn es dem PC zuviel ist wie kann ich es anders lösen?
(hab schon ein dualcore, 2gb ect..)
public void difrechner() { //die aktuellen Sekunden seit Jahr 0 werden ermittelt Int64 nowSekunden2 = DateTime.UtcNow.Ticks / 10000000; //auslesen der Sek. bei letzten beenden des programmes. String sek1 = ReadLine("D:\\Save.txt", 22); Int64 sekx = Convert.ToInt64(sek1); Int64 dif = nowSekunden2 - sekx; //berechnung der dif. //jetzt wird ausgerechnet wieviel punkte abgezogen werden müssen Int64 anzintervall = dif / 900; double anzintervalld = Convert.ToDouble(anzintervall); Math.Round(anzintervalld, 0); sL(Convert.ToInt16(anzintervalld));
EDIT: Ich habe den Code nocheinmal überarbeitet. (^^oben der ist eig. jetzt egal) Dabei habe ich bemerkt das es weniger am Code liegt sondern das Problem liegt ganz woanders. Und da es für mich unbegreiflich ist bitte ich um euren Rat (vllt ist es ja auch ganz simpel)
Das problem liegt bei der Zeile: sL(Convert.ToInt16(anzintervalld));
Um es zu vereinfachen machen wir es mal testweise so: sL(1);
Es wird Wert 1 übergeben und im programm abgezogen. Die Zeile "sL(1);" wird in der methode "Load()" gestartet, diese wiederum bei Programmstart autom. gestartet wird.
Immer stützt das Programm ab bzw. braucht ewig zum laden.
Erstelle ich testweise ein button welcher beim Klick sL(1); ausführt, funktioniert alles tadelos.
Wie kann das sein? (alles andere was oben zu sehen ist kann ich aktiv oder auch auskommentieren, macht keinen unterschied.)
Kurz: Wieso lässt sich eine Methode nicht automatisch starten, sondern nur mit einem z. B. Buttonklick?
Dieser Beitrag wurde von driv3r bearbeitet: 02. September 2010 - 15:18
- ← [gelöst!]doppelter Programm Aufruf
- Programmierung
- Brauche Hilfe Bei Klassendiagramm (uml), Wichtig! →