WinFuture-Forum.de: C# Wert Außerhalb Der Laufzeit ändern? - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

C# Wert Außerhalb Der Laufzeit ändern?


#1 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 353
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 30. August 2010 - 12:22

Hallo zusammen,

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 :ph34r:?

Ich hoffe ihr könnt mir Helfen, schonmal Vielen Dank.

Gruß marco
0

Anzeige



#2 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.126
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 30. August 2010 - 12:41

Zitat

ist es möglich, einen Wert außerhalb der Laufzeit kontinuirlich zu ändern?
Daß ein Programm, welches nicht läuft, keine Änderungen vornehmen kann, sollte klar sein.

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

0

#3 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 353
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 30. August 2010 - 12:58

Ok wenn ich dir mal folge;
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

Warum kann das Programm z.B. nicht einfach durchlaufen?

Das ist nicht möglich, da man sonst den PC rund um die Uhr anlassen müsste :ph34r:

Dieser Beitrag wurde von driv3r bearbeitet: 30. August 2010 - 13:00

0

#4 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.126
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 30. August 2010 - 13:23

Alle Variablen muß man sich merken:
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

Dauer: in der Regel mehrere Tage... (da der Wert zu laufzeiten wieder erhöht wird)
Kannst Du das etwas genauer erklären? Ohne diese Einschränkung könnte man sich auch einfach nur den Endzeitpunkt merken.

Dieser Beitrag wurde von Mr. Floppy bearbeitet: 30. August 2010 - 13:41

0

#5 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 353
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 30. August 2010 - 13:41

Ok das sieht doch schonmal gut aus. Aber das mit der Startzeit ist mir noch nicht so ganz klar. Um genau zu sein beginnt das ganze mit einem Buttonklick. Wie sieht es denn während der Laufzeit aus? Das müsste ich dann wohl mit einem Timer regeln der dann im Intervall diese Methoden aufruft oder?
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 =)
0

#6 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.126
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 30. August 2010 - 13:52

Wie gesagt, erkläre bitte genau was Du machen willst. Ich hab noch nichts mit C# gemacht, aber die Konzepte sind ja bei den Sprachen alle ähnlich.

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.
0

#7 Mitglied ist offline   Spiderman 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.675
  • Beigetreten: 23. November 06
  • Reputation: 26

geschrieben 30. August 2010 - 13:59

Du brauchst doch nur die Sekunden speichern:

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

0

#8 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 353
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 30. August 2010 - 14:05

Also um einen Wecker geht es nicht ist aber denke ich trotzdem das gleiche Prinzip. Nur das beim wecker ja im Endeffekt nur auf ein Ziel gewartet wird da braucht man den zwischen wert ja nicht wissen (nur beim ändern).
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?
0

#9 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.126
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 30. August 2010 - 14:11

Zitat

Jetzt starte ich das Programm nach einigen Stunden und klicke auf: "ein Eimer mit 10L Wasser in das Fass gießen.
An dieser Stelle erstellst Du quasi einen neuen Timer. Zu Deinem errechneten aktuellen Wert kommt das Äquivalent der 10 l hinzu und der Startzeitpunkt entspricht der aktuellen Zeit. Das ist wie das Starten des Weckers nur mit aktualisierten Werten. Evtl. geht's auch noch eleganter, aber ich bin gerade dabei mir mein Mittagessen zuzubereiten :ph34r:

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

0

#10 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 353
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 30. August 2010 - 14:18

@Mr. Floppy: na dann lass es dir mal schmecken :ph34r:

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.
0

#11 Mitglied ist offline   Spiderman 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.675
  • Beigetreten: 23. November 06
  • Reputation: 26

geschrieben 30. August 2010 - 14:21

Genau wie ich es oben geschrieben habe.

- 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
0

#12 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.126
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 30. August 2010 - 14:23

Hab meinen letzten Beitrag noch editiert. Du mußt den Timer nicht neustarten, wenn er sich ändern läßt :ph34r: Das ganze Drumherum kannst Du Dir aber sparen. Mit dem Ausgangswert von dem in einem Intervall etwas abgezogen wird, führst Du nur eine künstliche Zeit ein. Es reicht aber, wenn man das auf die tatsächliche Zeit umrechnet. Im Prinzip hast Du eine Wasseruhr beschrieben - denk mal drüber nach.
0

#13 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 353
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 30. August 2010 - 14:23

@Spiderman: ja den Pseudocode habe ich verstanden danke :ph34r:
Ich meinte wie man soetwas in C# schreibt? Ich brauche die Synax ect...
0

#14 Mitglied ist offline   Spiderman 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.675
  • Beigetreten: 23. November 06
  • Reputation: 26

geschrieben 30. August 2010 - 14:37

Beitrag anzeigenZitat (driv3r: 30.08.2010, 15:23)

Ich meinte wie man soetwas in C# schreibt? Ich brauche die Synax ect...

War doch schon in C#

long nowSekunden = DateTime.UtcNow.Ticks / 10000000;


Der Rest ist dein Programm(was es mit dem Wert macht).

Gruß
Spiderman
0

#15 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 353
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 02. September 2010 - 13:18

Okay, ich habe alles so angewendet. (mit long nowSekunden = DateTime.UtcNow.Ticks / 10000000;).

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

0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0