![]() |
Prozedur nach bestimmter Zeit abbrechen
Guten Tag,
ich habe mal wieder ein kleines Problem, bei dessen Lösung ich etwas Hilfe benötige. Ich habe eine Prozedur, die hauptsächlich aus zwei ineinander geschachtelten for-to-Schleifen besteht, sie sieht also ungefähr so aus:
Delphi-Quellcode:
da die Ausführung dieser Prozedur, vor allem auf weniger leistungsstarken Computern, sehr lange braucht, möchte ich sie, wenn nötig nach 10 Sekunden abbrechen.
for i:= 0 to 100 do
for j:= 0 to 100 do begin { ... } end; Mein Ansatz dazu sieht folgendermaßen aus:
Delphi-Quellcode:
das Funktioniert auch ganz gut.
function Zeitueberschreitung: Boolean;
begin if (t + EncodeTime(0, 0, 10, 0) >= now) then Result:= false else Result:= true; end; Allerdings weiß ich nicht, wie ich die Prozedur abbrechen kann, wenn Zeitüberschreitung = true ist. Gibt es überhaupt eine Möglichkeit die Prozedur im Rechenvorgang abzubrechen? vielen Dank im Voraus! |
Re: Prozedur nach bestimmter Zeit abbrechen
Nicht schön aber effektiv:
Delphi-Quellcode:
bzw.
Break;
Delphi-Quellcode:
oder besser Schleife umbauen und Abbruchbedingung mit aufnehmen
Exit;
|
Re: Prozedur nach bestimmter Zeit abbrechen
Ja du kannst mit
Delphi-Quellcode:
die Funktion verlassen!
Exit;
|
Re: Prozedur nach bestimmter Zeit abbrechen
Zunächst einmal solltest du der Ästhetik wegen folgendes schreiben:
Delphi-Quellcode:
Dann kannst du das in der Schleife folgendermaßen verwenden:
function Zeitueberschreitung: Boolean;
begin result := (t + EncodeTime(0, 0, 10, 0) < now); end;
Delphi-Quellcode:
Ein einfaches Break würde hier nur in der äußeren Schleife funktionieren, in der inneren würde es auch nur genau diese abbrechen, die äußere liefe aber weiter:
begin
try for i:= 0 to 100 do for j:= 0 to 100 do begin if Zeitueberschreitung then Exit; // Dies verzögert die Gesamtbearbeitung allerdings etwas... { ... } end; finally { Hier muss der Code zum Aufräumen hin. Der wird auch bei einem Exit ausgeführt. } end; end;
Delphi-Quellcode:
Dieser Ansatz ist dann vorzuziehen, wenn die innere Schleife nicht allzuviel Zeit braucht, da sonst sehr häufig die Funktion Now aufgerufen wird.
for i:= 0 to 100 do begin
if Zeitueberschreitung then Break; for j:= 0 to 100 do begin { ... } end; end; |
Re: Prozedur nach bestimmter Zeit abbrechen
Zitat:
Vielen Dank für die Hilfe, die Ansätze scheinen sehr vielversprechend, ich werde das mal in die Tat umsetzen. :thumb: |
Re: Prozedur nach bestimmter Zeit abbrechen
Das heißt, auf einem langsamen Rechner musst du dann mit halb bearbeiteten Daten und somit eventuell korrupten Daten klar kommen?
|
Re: Prozedur nach bestimmter Zeit abbrechen
Na, wer wird denn so etwas vermuten? :roll:
Im Falle des Abbruchs erfolgt (natürlich) ein rollback ..... oder? :wink: |
Re: Prozedur nach bestimmter Zeit abbrechen
anstelle immer wieder Encode... zu verwenden kannst du auch einfach GetTickCount verwenden.
|
Re: Prozedur nach bestimmter Zeit abbrechen
Delphi-Quellcode:
also statt der "zeitraubenden" Berechnungen via EncodeTime und den ganzen reellen Zahlen, macht sich 'ne kleine Interegeroperation via GetTickCount wohl besser
var start: LongWord;
start := GetTickCount; for i:= 0 to 100 do begin for j:= 0 to 100 do begin if GetTickCount - start > 10000 then break; end; if GetTickCount - start > 10000 then break; end; // 10000ms = 10s // oder mit 'ner zusätzlichen Variable var start: LongWord; b: Boolean; start := GetTickCount; for i:= 0 to 100 do begin for j:= 0 to 100 do begin b := GetTickCount - start > 10000; if b then break; end; if b then break; end; und wenn man kein hartes Exit mag, dann halt einfach mehrere Abbruchbedingungen |
Re: Prozedur nach bestimmter Zeit abbrechen
HI,
lager doch die Prozedur in einen weiteren Thread aus, den du startest. Dann wartest du entweder auf Fertig oder auf 10 sekunden. Falls die 10 sekunden erreicht sind, beendest du den Thread und weg ist er. Bei Fertig machst du einfach weiter. So muss man sich wenigstens keine Gedanken über Abbruchbedinguingen machen und die Prozedur läuft mit geschätzten 1-2 Durchgängen pro Sekunde schneller. Bernhard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:48 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