Autor Beitrag
glnklein
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 26.03.12 00:13 
hallo ,
ersteinmal ich blutiger anfänger und habe noch so gut wie keine ahnung von C#

ich möchte eine if anweisung die nur eintrit wenn es zb. 15.05 uhr , 15.10 uhr , 15.15 uhr ,usw ist .
also ausführen alle 5 minuten egal welche stunde und welcher tag , ach und natürlich auch nur einmal alle 5 minuten
also nicht um 15.05 und 10 sec und dann nochmal um 15.05 und 30 sec das bitte nicht .

ich dachte zuerst an einen timer nur der unterbricht mein programm ja oder etwa nicht ??


Moderiert von user profile iconTh69: Topic aus WinForms verschoben am Mo 26.03.2012 um 10:13
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.03.12 01:04 
Hallo und :welcome:

Der Timer unterbricht nix, dein Code muss im Timer-Event stehen, so dass du auf das Ereignis reagierst.

Eine ständig laufende Schleife, die z.B. mit einer if-Abfrage prüft, ob die Zeit erreicht ist, ist keine so gute Idee. Denn dann muss ja ständig geprüft werden. Viel einfacher ist doch, wenn du einfach vom Timer gesagt bekommst, dass nun wieder 5 Minuten herum sind. ;-)
glnklein Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 26.03.12 08:23 
Guten morgen :-)

Wie müste ich das den dann schreiben ?

Die Abfrage steht in einem Loop der mir ca jede Minute
In einer console zeigt ob mein eigener Server noch erreichbar ist.
Der Zweck der 5 min Abfrage ist eigentlich das ich nicht bei jeder Abfrage eine
Ausgabe bekomme sondern halt alle 5 min es angezeigt wird , die Abfrage prüft
Zwar ständig nur die Ausgabe in der console wollte ich auf alle 5 min beschrecken.

Ich dachte mit

If mm = "05"
{
Ausgabe console
}


Damit müste nur alle Intervalle auflisten was ja doof ist
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.03.12 08:38 
Erstens reicht es zu schauen, ob die Zahl durch 5 teilbar ist (sprich die Zahl modulo 5 == 0 ist).

Und zweitens:
Worum geht es dir eigentlich? Um das Ausführen alle 5 Minuten, egal wann, oder um das Ausführen zu genau diesen Zeiten?

Soweit ich das verstanden habe, geht es doch nur um die 5 Minuten Abstand, oder? Und genau das macht ein Timer. Du setzt das Intervall auf 5 Minuten und packst deinen Code in das Timer-Event und fertig.

Ich sehe jetzt allerdings, dass du eine Konsolenanwendung hast. Warum? Denn damit kannst du den Timer nicht nutzen und musst immer das Konsolenfenster offen haben...
Wenn du das damit machen willst, bleibt dir in der Tat nur zu schauen, ob die Minute durch 5 teilbar ist.
glnklein Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 26.03.12 10:17 
durch 5 teilbar ist eine super idee , wie müste der code den aussehen das erst die aktuelle minuten zahl geteilt wird ????
danke
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.03.12 11:34 
Siehe Liste der Operatoren:
msdn.microsoft.com/d...ibrary/6a71f45d.aspx
Und bei den multiplikativen Operatoren findest du auch den für modulo:
msdn.microsoft.com/d...ibrary/0w4e0fzs.aspx
glnklein Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 26.03.12 13:59 
Da blick ich nicht ganz durch wie muss den dann der Code
Aussehen und was muss ich da noch rein setzen damit es auch nur einmal alle 5 Minuten ausgeführt wird ?
daeve
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 116
Erhaltene Danke: 3

Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
BeitragVerfasst: Mo 26.03.12 15:23 
mit einem Timer Objekt kannst du alle 5 min einen Code ausführen. (wie jaenicke breits erwähnt hat)

Der Code sollte selbsterklärend sein.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Timer t1 = new Timer(); // Timer anlegen
t1.Interval = 100// Intervall festlegen, hier 100 ms
t1.Tick+=new EventHandler(t1_Tick); // Eventhandler ezeugen der beim Timerablauf aufgerufen wird
t1.Start(); // Timer starten

void t1_Tick(object sender, EventArgs e)
{
// dieser Code wird ausgeführt, wenn der Timer abgelaufen ist
}


hoffe damit kommst du weiter.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.03.12 15:42 
Geht aber nur so einfach, wenn es nicht mehr nur eine Konsolenanwendung ist. ;-)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 26.03.12 16:01 
Wenn man nicht gerade den Winforms Timer nimmt (wie scheinbar daeve) sondern den aus dem System.Threading oder System.Timers Namespace dann schon.
glnklein Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 26.03.12 16:28 
Mit dem Tuner das geht nicht da ich ja bereits einen Loop habe ,
Die Idee mit dem durch 5 teile halte ich für die beste :-)

So in etwa habe ich mir das gedacht

$uhrzeitinminuten = ja wo die Minute Zahl hernehmen
$Ergebnis = $uhrzeitinmunuten/5

If $Uhrzeitinminuten == 0
{
Code ausfuhren
}
else
{
Nix machen
}
60sec nicht nochmal ausgeführt werden soll und fertig ,und Konsole muss bleiben sorry
ujr
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 102
Erhaltene Danke: 12



BeitragVerfasst: Mo 26.03.12 16:44 
user profile iconglnklein hat folgendes geschrieben Zum zitierten Posting springen:
Mit dem Tuner das geht nicht da ich ja bereits einen Loop habe ,
Die Idee mit dem durch 5 teile halte ich für die beste :-)


Was für ein "Tuner"?

So richtig verstehen kann ich Dich sowieso nicht. Du schreibst, dass Du "blutiger Anfänger" bist und keine Ahnung hast. Dann rät man Dir zu einem Timer, der tatsächlich für das gewünschte das Mittel der Wahl ist, und dann meinst Du alles besser zu wissen? Wenn Du einen Loop hast, dann schreib ihn um. Sowas wird Dir noch öfter passieren.

Und nein, wenn Du keine Lust hast, bei Google z. B. "C# Uhrzeit" einzugeben, dann werde ich Dir auch nicht sagen, wo Du die herbekommst.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 26.03.12 16:49 
Zitat:
Mit dem Tuner das geht nicht da ich ja bereits einen Loop habe


Beim Programmieren ist es durchaus üblich auch bereits vorhanden Code wieder zu ändern. Dafür gibts keine Minuspunkte.

Zitat:
60sec nicht nochmal ausgeführt werden soll und fertig


Für die 60sec würde ich jetzt schon wieder einen Timer empfehlen. Warum dann nicht gleich für das eigentliche Problemchen?
glnklein Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 26.03.12 23:47 
Ich wollte dann doch nicht ein Problem lösen um es durch ein anderes zu ersetzen ,
wenn du an deinem auto einen vorne links einen platten hast nimst du ja auch nicht ein rad von hinten rechts um vorne das problem zu lösen :D

ich hab es jetzt so gemacht und es klappt :


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
DateTime saveNow = DateTime.Now;
int minute = saveNow.Minute;
                               
                            if ((minute % 5) == 0)
                            {

                                
                            Log.Info("ohne Rest teilbar");
                             
                                  System.Threading.Thread.Sleep(60000);
                                  for (int i = 0; i < 100; i++)
                                  {
                                    Log.Info("Jetzt gehts erst weiter ");   
                                  }


                            }
                            else
                            {
                               Log.Info("nicht ohne Rest teilbar"); 
                               
                            }


der Code geht bestimmt auch kürzer aber für mich als anfänger ist er so übersichtlicher

Danke an alle