Sleep, TimeSpan, Interval

astaluego

Erfahrenes Mitglied
Hallo! Ich hab ein kleines Problem

Zuerst mal zu den Begriffen. Auf dieser Seite: msdn-sleep-timespan
werden Objekte von Threads und TimeSpans erstellt aber ich frage mich wozu wenn man einen Sleep so machen kann.
Code:
System.Threading.Thread.Sleep(5000);

Zurück zu meinem Problem ich möchte das mein Code im Main jeden Tag um Mitternacht ausgeführt wird. Ich weiss das System.DateTime.Now.Hour mir die aktuelle Stunde zurück gibt und das 86400000 millisekunden ein Tag sind und jetzt fehlt mir nur noch der Code :p

danke im voraus
 
Das Thread.Sleep-Event hält den aktuellen Thread für die angegebe Zeitspanne (ms.) an.
(z. Bsp. ein Timeout oder Warten bis ein Com-Objekt mit was fertig ist)

[thread=173903]Zeitmessbefehl-Thread[/thread]
[thread=179681]TimeSpawan-Thread[/thread]

Vorschlag:
Könntest quasi einen Timer nehmen dessen Interval 5 Sekunden oder so entspricht.
Dann rechnest Du bei jedem OnTick-Ereigniss die vergangenen Sekunden dazu.
Code:
_Time = _Time.AddMilliseconds( tmrPlayCount.Interval );
Wenn die Zeitspanne vorrüber ist kannst Du dein anderes Proggi starten.
Code:
new TimeSpan( _Time.Ticks ).TotalMilliseconds
Ich hoffe das hilft.

MfG cosmo
 
Wieso selbst hochzählen? Annahme: Timer tickt alle 5 Sekunden:

Im Timer einfach folgenden Code:
Code:
if (DateTime.Now.Hour == 0 && DateTime.Now.Minute == 0 && DateTime.Now.Second < 6) {
     // call method
}
Damit ist garantiert, dass das Teil nur _einmal_ ausgeführt wird. Spätestens um 5 Sekunden nach Mitternacht.

Du könntest dir natürlich auch das entsprechende Event vom System einbinden, dies würde aber vermutlich mehr Overhead verursachen.
 
Zuletzt bearbeitet:
irgendwie hast du mir alle klarheiten beseitigt die ich hatte...
es geht ja um ein pars programm das immer nach einem vollendeten tag um mitternacht die files parsen soll.
Bei mir sieht das ungefähr so aus:
Code:
  string zeit = "0:0:0";

          while(true)
          {   
              if(zeit.Equals(DateTime.Now.Hour.ToString() + ":" DateTime.Now.Minute.ToString() + ":" DateTime.Now.Second.ToString()))
              {
                  System.Threading.Thread.Sleep(86400000);
                  Console.WriteLine("jetzt ist gerade: " + System.DateTime.Now.ToString());
                  p.parseFile(@"C:\....");     
              }
          }
Das dies eine primitive und noch dazu nicht korrekt funktionierende Variante ist, is mir klar. Das Prob ist das Sleep hier gar nichts verloren hat denn das Parsen braucht auch seine Zeit so wird sich das immer um ein paar Sekunden verschieben. Ich möchte einfach dieser hässlichen while Schleife aus dem Weg gehen. Zudem soll das Parsen während der Pause stattfinden sodass sich eben wirklich keine Sekunde verschiebt.
Kannst du denn das mit dem Interval mehr verdeutlichen?
 
Gut, mein Beispiel macht eher bei kurzen Intervallen sinn.
Norbert's Vorschlag war gut. ;)
astaluego hat gesagt.:
Zudem soll das Parsen während der Pause stattfinden sodass sich eben wirklich keine Sekunde verschiebt.
Dann währe doch das naheliegenste das Parsen in einem Thread auszuführen.
Das mit dem Intervall ist so gemeint, dass bei jedem Tick der Wert der TimerIntervalls quasi die vergangene Zeit darstellt und ihn somit zu deinem Time-Objekt dazurechnen kannst, um somit die vergangene Zeit zu berechnen.

MfG cosmo
 
Die while(true)-Schleife ist ohnehin Schwachsinn.

Wie gesagt, erstelle einen System.Timers.Timer. Ins Elapsed-Event klopfst du meinen Code. Deine Parsing-Sache gibst in eine eigene Methode und diese wird dann einfach aufgerufen, an der Stelle, wo ich ohnehin den entsprechenden Kommentar gestellt hab.

Damit ist die Geschichte fertig. Kein schmutziges while(true) und alles läuft.
 
Also ich hab mal das gemacht was du gesagt hast kanns es mal nachchecken?

Code:
static void Main(string[] args)
        {
            parser p = new parser();
            if(args.Length != 0)
                p.path = args[0].ToString();
        
            System.Timers.Timer timeObj = new System.Timers.Timer(86400000);
            timeObj.Start();
            timeObj.Elapsed +=new ElapsedEventHandler(timeObj_Elapsed);
                        
        }
        private static void timeObj_Elapsed(object sender, ElapsedEventArgs e)
        {
            if (DateTime.Now.Hour == 0 && DateTime.Now.Minute == 0 && DateTime.Now.Second < 6) 
                 myClass.goThroughFiles();
            
        }
Bist du dir sicher, dass der Timer dann wieder von vorne anfängt zu zählen nachdem es abgeloffen ist? Oder muss ich in timeObj_Elapsed noch this.Start(); machen?
 
Norbert's Vorschlag war auf 5 Sekunden bezogen.
Code:
DateTime.Now.Second < 6
würde hier nichts bringen da das Tick-Event erst nach einem Tag ausgeführt wird und Du sowieso das ganze dann genau um Mitternacht starten musst. Der Intervall muss also auf 5000.
Das Event würd ich der Korrekheit halber vor dem Start verknüpfen.
Bist du dir sicher, dass der Timer dann wieder von vorne anfängt zu zählen nachdem es abgeloffen ist? Oder muss ich in timeObj_Elapsed noch this.Start(); machen?
Das Start reicht einmal aus. Der Timer stoppt erst wenn Du es veranlasst (oder dein Proggi schmiert ab:p).

MfG cosmo
 
Ja ich will das es 24h lang 7 Tage die Woche läuft also denk ich das ein Stopp nich nötig ist :p eine Frage hät ich jedoch noch.
Bei der Event funktion (timeObj_Elapsed) kann ich nicht auf mein p - Objekt zugreifen welches ich in main initialisiert habe muss ich die funktion als static deklarieren oder wie?

und wie ist jetz das genau mit den 5000 ? Ich will ja das es alle 24 h abläuft und nicht alle 5 sek.
 
Zurück