Entwickler-Ecke

Basistechnologien - DateTime-Objekt zum Zählen bringen.


Trautmann - Di 24.03.09 23:48
Titel: DateTime-Objekt zum Zählen bringen.
Hiho,

ich würd gern wissen wie ich ein DateTime-Objekt zum Zählen bringe. Wenn ich es normal definiere alá

C#-Quelltext
1:
Datetime d1 = new Datetime();                    

bekomme ich zwar ein "leeres" Zeitobjekt aber die Zeit darin vergeht nicht- es sind immer 0 Sekunden.
Ich hab das ganze schon mal durch Zufall hinbekommen und bin jetzt ganz verzweifelt weil ichs nicht mehr rekonstruieren kann. :(

Habe 3.5er Framework.

danke schon jetzt,

Trautmann

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Christian S. - Di 24.03.09 23:49

Die aktuelle Zeit bekommst mit DateTime.Now, falls Du das meinst :gruebel:


Trautmann - Di 24.03.09 23:54

Hallo,

ich suche ein Objekt erstellen das die Zeit von seinem Entstehungszeitpunkt an zählt.


Christian S. - Mi 25.03.09 00:53

Ein vorgefertigtes Objekt kenne ich nicht. Aber Du kannst die vergangene Zeit so bestimmen:


C#-Quelltext
1:
2:
3:
4:
5:
DateTime start = DateTime.Now;

/* ... Kaffee trinken gehen ... */

TimeSpan vergangen = DateTime.Now - start;


Wenn Du das mit nem Timer kombinierst, kannst Du auch "zählen".


Kha - Mi 25.03.09 09:41

user profile iconTrautmann hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab das ganze schon mal durch Zufall hinbekommen und bin jetzt ganz verzweifelt weil ichs nicht mehr rekonstruieren kann. :(
War das vielleicht die Stopwatch-Klasse (.StartNew)?


Trautmann - Mi 25.03.09 18:31

Hiho,

ich hab Christians-Methode mal probiert und ich denke die wars, danke.

Leider hab ich jetzt das Problem das der Timer-Eventhandler nicht ausgeführt wird. Was mach ich falsch?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
        private void button1_Click(object sender, EventArgs e)
        {
            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += new DoWorkEventHandler(kill);
            bw.RunWorkerAsync();
        }
        public void kill(object sender, DoWorkEventArgs e)
        {
            System.Windows.Forms.Timer t1 = new System.Windows.Forms.Timer();
            t1.Interval = 1000;
            t1.Tick += new EventHandler(zeig);
            t1.Enabled = true;
        }
        private void zeig(object sender, System.EventArgs e)
        {
             MessageBox.Show("test");
        }


Edit: Aso alles klar Timer startet schon einen eigenen Thread.

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Ralf Jansen - Mi 25.03.09 19:11

Der von dir benuzte Timer benutzt keine Threads. Dazu müßtest du System.Threading.Timer verwenden.
Threads sind in diesem Fall aber auch unnötig also auch der Backgroundworker.

Der Tick Event des Timer wird vermutlich nicht gefeuert weil du eine lokale Variable für den Timer benutzt.
Bevor der Event auch nur einemal aufgerufen werden kann ist die kill Methode schon zu Ende gelaufen der Timer damit nicht mehr referenziert und wird vom GC zerstört. Du solltest aus dem Timer also eine Instanzvariable machen.


Flitzs - Mi 25.03.09 23:21

Hallo,
der System.Windows.Forms.Timer verwendet die Nachrichten-Queue des Threads in dem das GUI läuft, und ist daher für dein Beispiel nicht geeignet. Somit musst du wohl System.Timers.Timer verwenden, oder den System.Windows.Forms.Timer im GUI Thread starten (was ja kein Problem sein sollte, da er ja nicht blockiert).

mfg Flitzs