Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie Prozedur immer zu best. Zeit starten ohne Taskplanner? (https://www.delphipraxis.net/113970-wie-prozedur-immer-zu-best-zeit-starten-ohne-taskplanner.html)

JuliaBecks 17. Mai 2008 15:10


Wie Prozedur immer zu best. Zeit starten ohne Taskplanner?
 
vorab dieser beitrag hat mir nicht geholfen
http://www.delphipraxis.net/internal...tarten&start=0

Hallo Delphigemeinde,

wie schaffe ich es in meinem Programm, welches permanent läuft eine bestimmte Procedure z.b "ReadNews"
zu einer bestimmten Zeit zu starten.
Die Zeitspanne "von" bis "bis" wird der User eingeben.
Z.b von 14:00 bis 16:00 immer Nachmittags.

kann ich irgendwie im Timer den interval aus dem Abstand der "bis-zeit" und der nächsten "von-Zeit" setzen oder
wie würdet ihr sowas machen?
danke für die tipps.

Julia

mkinzler 17. Mai 2008 15:15

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
Du könntest einen Dienst scheiben

JuliaBecks 17. Mai 2008 15:17

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
wie würde sowas aussehen können?

Kruemel_02 17. Mai 2008 15:24

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
Wie erstelle ich einen Dienst für WinNT / Win2000 / Win XP

8)

JuliaBecks 17. Mai 2008 15:30

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
das würde bedeuten ich müsste mein ganzes programm umschreiben und nicht eine normale Anwendung erstellen sondern eine Dienstanwendung?
das würde ja mein problem "zu bestimmter zeit eine Procedur starten während das programm immer läuft" doch nicht lösen oder?

Luckie 17. Mai 2008 15:31

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
Wenn das Programm sowieso permanent läuft, warum dann keinen Timer nehmen?

mkinzler 17. Mai 2008 15:32

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
Doch der Dienst müsste nur mit der Anwendung kommunizieren ( Named Pipes; IPC, ...)

JuliaBecks 17. Mai 2008 15:37

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
belastet der timer arg mein system während er sag ich mal 24 stunden wartet bis erneut 13:00 Nachmittags ist und meine Funktion aufruft?
wie könnte die implementierung aussehen?

irgendwie so?

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  timer : TTimer;
begin
  Timer := TTimer.Create(self);
  Timer.Interval := 2000;
  if now = StrToDatetime(DateToStr(Now)+'14:00:00') then
    Timer.Enabled := True;

  Timer.OnTimer := StarteFunktion;
end;
das klappt nicht denn alle 2 Sek startet meine funktion ohne das Zeit geprüft wird :cry:

mkinzler 17. Mai 2008 15:45

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
Du sagst es ihr ja auch, und dann wird die Funktion aufgerufen. Du musst in der Eventmethode die Uhrzeitünerprüfung durchführen und dann ggf die gewünschte Aktion ausführen.

JuliaBecks 17. Mai 2008 15:55

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
könnte das dann vielleicht so funktionieren?


Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  timer : TTimer;

begin
  Timer := TTimer.Create(self);
  Timer.Interval := 2000;
  Timer.Enabled := True;
  Timer.OnTimer := StarteFunktion;
end;


procedure TForm1.StarteFunktion;
begin
  // Prüfen ob die Anfangszeit erreicht ist
  if now = StrToDatetime(DateToStr(Now)+'14:00:00') then
    begin
      // Timer ausschalten
      timer.Enabled := false;
      // Wiederholen bis die Endzeit erreicht ist
      repeat
        StarteEineBestimmteProcedure;
      until now >= StrToDatetime(DateToStr(Now)+'16:00:00');
      // Timer wieder einschalten
      timer.Enabled := True;
    end;
end;

Luckie 17. Mai 2008 16:01

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
Was wenn der Timer eine Sekunde nach zwei Uhr aufgerufen wird? Die Abfrage muss auf größer lauten und nicht auf gleich.

Zitat:

Zitat von JuliaBecks
das klappt nicht denn alle 2 Sek startet meine funktion ohne das Zeit geprüft wird :cry:

Was heißt das? Wird deine Funktion in einer Schleife ständig aufgerufen?

mkinzler 17. Mai 2008 16:02

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
Nein, denn das hat 2 Probleme:
-Da du genau abfragst, ist es sehr wahrscheinlich, dass es nie wahr wird.
-wenn einmal gestartet ist, friert es dein System ein.
Soll deine Prozedur wirklich ununterbrochen aufgerufen werden?

Delphi-Quellcode:
procedure TForm1.StarteFunktion;
begin
  // Prüfen ob die Anfangszeit erreicht ist
  if now > EncodeTime( 14, 0, 0) and Now < EncodeDate(16,0,0) then
  begin
      StarteEineBestimmteProcedure;
  end;
end;

JuliaBecks 17. Mai 2008 16:07

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
ja in der zeitspanne dieser 2 stunden soll das Programm etwas abarbeiten, ist z.b 16:00 erreicht soll sie aufhören und 24 stunden später erneut anfangen

Fussball-Robby 17. Mai 2008 16:09

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
Was macht diese Funktion denn? Muss sie kontinuierlich neu aufgerufen werden? Das könntest du mit einem Thread regeln, ansonsten friert das Programm ein.

JuliaBecks 17. Mai 2008 16:15

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
diese Funktion guckt an einem bestimmten Ort nach ob Dateien da sind, wenn ja ließt sie die Inhalte in die DB. In dieser Zeispanne können nach einander mehrere Dateien reinkommen und die Funktion prüft nach der Abarbeitung einer Datei ob eine neue da ist und macht immer so weiter bis Endzeitpunkt erreicht ist. 24 Std. später muss erneut diese Funktion aufgerufen werden, ohne das Programm neustarten zu müssen!

Apollonius 17. Mai 2008 16:16

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
Wenn eine bestimmte Zeit vorgegeben ist, ist die beste Lösung ein Waitable Timer.

JuliaBecks 17. Mai 2008 16:23

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
hierzu hab ich nur das gefunden

http://delphi32.blogspot.com/2006/03...in-delphi.html

als NuberOfSeconds müsste ich dann mein Abstand nehmen?

hätte gedacht das es einfacher geht :-)

Apollonius 17. Mai 2008 16:42

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
Das meinte ich nicht. Lies dir doch mal die Dokumentation durch. Das tolle an Waitable Timern ist nämlich, dass du eine absolute Zeit angeben kannst, nicht nur einen Abstand wie bei normalen Timern. Der einzige Nachteil ist, dass du die geposteten APCs irgendwie annehmen musst, aber es sollte eigentlich kein Problem sein, die Nachrichtenschleife auf ein alterables (?) Warten umzustellen.

Die Materie kann allerdings sehr verwirrend sein, wenn man sich nicht mit Windows-Programmierung auskennt.

JuliaBecks 17. Mai 2008 16:58

Re: Wie Prozedur immer zu best. Zeit starten ohne Taskplanne
 
ich DANKE ersteinmal allen beteiligten für die hilfreichen Antworten!!!!

ich werde mir bei gegenheit die Doku auf jedenfall mal ansehen und nach besserer Lösung dort suchen.

auf die schnelle hab ich das nun so gelöst, es funktioniert für meine Anforderungen zumindest:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer := TTimer.Create(self);
  Timer.Interval := 1000;
  Timer.Enabled := True;
  Timer.OnTimer := StarteMeineFunktion;
end;


procedure TForm1.StarteMeineFunktion(Sender: TObject);
var Y, M, D : Word;
    Startzeit, Endzeit : TDatetime;
begin
  // Aktuelles Datum entschlüsseln
  DecodeDate(Now, Y, M, D);
  // Startzeit und Endzeit vorbelegen
  Startzeit := EncodeDate(Y,M,D) + EncodeTime(14,0,0,0);
  Endzeit  := EncodeDate(Y,M,D) + EncodeTime(16,0,0,0);

  // Prüfen, ob ich innerhalt der Zeitspanne bin
  if (now > Startzeit) and (Now < Endzeit) then
    begin
      // Timer aussetzen
      timer.Enabled := false;
      BEGINNEMITDEMLESEVORGANG;
      // Timer erneut einschalten
      timer.Enabled := true;
    end
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz