Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Allgemeine Fragen zu Diensten/Services - Flusskontrolle (https://www.delphipraxis.net/127647-allgemeine-fragen-zu-diensten-services-flusskontrolle.html)

lowmax_5 16. Jan 2009 13:16


Allgemeine Fragen zu Diensten/Services - Flusskontrolle
 
Hallo,

ich habe einen Dienst/Service erstellt eine Importroutine ausführt.
In einem definierten Intervall z.B. alle 5 Sekunden wird diese Importroutine ausgelöst.

Nun ergeben sich für mich folgende Fragen:

a)
Was mache ich nun, wenn die Ausführung der Importroutine manchmal länger als 5 Sekunden benötigt?
Wie kann ich den Thread während der Ausführung z.B. anhalten/pausieren lassen und ihn anschließend wieder sauber starten?
Hintergrund ist, dass die Importroutine zur gleichen Zeit nur 1x ausgeführt werden darf. Ich möchte jedoch auch keine Zeit verschwenden und sofort nach der Ausführung der Importroutine mit dem nächsten Job beginnen.

b) Mit 'sleep()' kann ich ja eine Zeit angeben, in der kein erneuter Aufruf erfolgt. Was kann man tun, wenn die Ausführungszeit der Importroutine stark variiert?

b) Kann innerhalb der Importroutine des Threads ein 'exit' verwendet werden, um bei einem Fehler die Routine sauber zu verlassen oder gibt es dafür einen besseren Weg? Der Thread soll ja nach einem Fehler sauber weiterlaufen.

Über ein paar Tipps würde ich mich sehr freuen!

lowmax

nahpets 16. Jan 2009 13:50

Re: Allgemeine Fragen zu Diensten/Services - Flusskontrolle
 
Hallo,

sowas müsstest Du doch per Timer machen können.

Du baust ein Timerereignis, dass Deine Importroutine enthält und startest beim Servicestart den Timer.

Im Timerereignis schaltest Du als erstes den Timer aus, dann machst Du den Import und schaltest anschließen im Timerereignis den Timer wieder ein.

SirThornberry 16. Jan 2009 14:16

Re: Allgemeine Fragen zu Diensten/Services - Flusskontrolle
 
Eigentlich gibst du dir die Antwort schon selbst :-) Führe die Importroutine erst erneut aus wenn die vorherige beendet ist. Wenn du den Quelltext zum starten der Importroutine geschrieben hast weißt du ja auch wie du prüfen kannst ob diese läuft. Und wenn du es noch nicht prüfen kannst, kannst du es zumindest selbst einbauen das du irgendwo einen Status hast den du auch abfragen kannst.

lowmax_5 16. Jan 2009 14:28

Re: Allgemeine Fragen zu Diensten/Services - Flusskontrolle
 
Hallo,

ich vermute, dass es an der Importroutine liegt. Wenn alles korrekt läuft wird als Status ein True zurückgegeben.
Geht es schief, wird ein False zurückgegeben. Der Prozess wird dann aber mit einem 'Exit' in der Importroutine beendet.
Irgendwie scheint der Prozessablauf durch das 'Exit' gestört. Kann man ein 'Exit' denn in einem Dienst/Service ohne weiteres verwenden oder gibt es elegantere Möglichkeiten?

lowmax

Mr_G 16. Jan 2009 14:43

Re: Allgemeine Fragen zu Diensten/Services - Flusskontrolle
 
Also mir hat man beigebracht, dass "exit" böse ist ;). Kannst du das Exit nicht mit anderen Konstrukten ersetzen?
Zum Thema Ablauf:
Zitat:

Zitat von lowmax_5
Geht es schief, wird ein False zurückgegeben. Der Prozess wird dann aber mit einem 'Exit' in der Importroutine beendet.

Das versteh ich nicht. Was passiert wo wie...
Allgemein: Ich könnte mir vorstellen bei diesem Problem mit Threads zu arbeiten: Hauptthread startet ImportThread und wartet, bis dieser fertig ist. Dann wird ggf. ein neuer Import gestartet usw...

lowmax_5 16. Jan 2009 15:00

Re: Allgemeine Fragen zu Diensten/Services - Flusskontrolle
 
Das 'exit' hinter einem False bei einem Fehler wird gesetzt, damit die Importroutine wirklich nicht weitermacht, wenn ein Fehler aufgetreten ist.
Ansonsten müsste ja das die gesamte Routine umgestellt werden.

Errorflag=Prüfroutine1();

if Errorflag=True then
Prüfroutine2();

if Errorflag=True then
Prüfroutine3();

if Errorflag=True then
Prüfroutine4();
....


lowmax

lowmax_5 21. Jan 2009 16:09

Re: Allgemeine Fragen zu Diensten/Services - Flusskontrolle
 
Hat sich erledigt...

... ein Rückgabewert einer Funktion war nicht definiert! :wall:

lowmax


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 Uhr.

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