Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prozedur nach bestimmter Zeit abbrechen (https://www.delphipraxis.net/126564-prozedur-nach-bestimmter-zeit-abbrechen.html)

Gentleman 28. Dez 2008 13:20


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:
for i:= 0 to 100 do
  for j:= 0 to 100 do
    begin  
      { ... }
    end;
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.

Mein Ansatz dazu sieht folgendermaßen aus:
Delphi-Quellcode:
function Zeitueberschreitung: Boolean;
begin
  if (t + EncodeTime(0, 0, 10, 0) >= now) then
    Result:= false
  else
    Result:= true;    
end;
das Funktioniert auch ganz gut.
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!

mkinzler 28. Dez 2008 13:22

Re: Prozedur nach bestimmter Zeit abbrechen
 
Nicht schön aber effektiv:
Delphi-Quellcode:
Break;
bzw.
Delphi-Quellcode:
Exit;
oder besser Schleife umbauen und Abbruchbedingung mit aufnehmen

lbccaleb 28. Dez 2008 13:22

Re: Prozedur nach bestimmter Zeit abbrechen
 
Ja du kannst mit
Delphi-Quellcode:
Exit;
die Funktion verlassen!

Uwe Raabe 28. Dez 2008 13:31

Re: Prozedur nach bestimmter Zeit abbrechen
 
Zunächst einmal solltest du der Ästhetik wegen folgendes schreiben:

Delphi-Quellcode:
function Zeitueberschreitung: Boolean;
begin
  result := (t + EncodeTime(0, 0, 10, 0) < now);
end;
Dann kannst du das in der Schleife folgendermaßen verwenden:

Delphi-Quellcode:
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;
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:

Delphi-Quellcode:
for i:= 0 to 100 do begin
  if Zeitueberschreitung then Break;
  for j:= 0 to 100 do
    begin  
      { ... }
    end;
end;
Dieser Ansatz ist dann vorzuziehen, wenn die innere Schleife nicht allzuviel Zeit braucht, da sonst sehr häufig die Funktion Now aufgerufen wird.

Gentleman 28. Dez 2008 20:45

Re: Prozedur nach bestimmter Zeit abbrechen
 
Zitat:

Zitat von Uwe Raabe
Zunächst einmal solltest du der Ästhetik wegen folgendes schreiben:

Delphi-Quellcode:
function Zeitueberschreitung: Boolean;
begin
  result := (t + EncodeTime(0, 0, 10, 0) < now);
end;

Da hast du Recht, das sieht gleich etwas netter aus. :wink:

Vielen Dank für die Hilfe, die Ansätze scheinen sehr vielversprechend, ich werde das mal in die Tat umsetzen. :thumb:

Luckie 28. Dez 2008 20:59

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?

taaktaak 28. Dez 2008 21:04

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:

SirThornberry 28. Dez 2008 21:09

Re: Prozedur nach bestimmter Zeit abbrechen
 
anstelle immer wieder Encode... zu verwenden kannst du auch einfach GetTickCount verwenden.

himitsu 29. Dez 2008 12:50

Re: Prozedur nach bestimmter Zeit abbrechen
 
Delphi-Quellcode:
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;
also statt der "zeitraubenden" Berechnungen via EncodeTime und den ganzen reellen Zahlen, macht sich 'ne kleine Interegeroperation via GetTickCount wohl besser
und wenn man kein hartes Exit mag, dann halt einfach mehrere Abbruchbedingungen

rollstuhlfahrer 29. Dez 2008 23:41

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 21:06 Uhr.
Seite 1 von 2  1 2      

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