Delphi-PRAXiS
Seite 2 von 2     12   

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)

Luckie 17. Mai 2008 15: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 15: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 15: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 15: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 15: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 15: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 15: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 15: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 15: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 17:25 Uhr.
Seite 2 von 2     12   

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-2025 by Thomas Breitkreuz