AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prozedur nach bestimmter Zeit abbrechen

Ein Thema von Gentleman · begonnen am 28. Dez 2008 · letzter Beitrag vom 30. Dez 2008
Antwort Antwort
Seite 1 von 2  1 2      
Gentleman

Registriert seit: 29. Sep 2004
302 Beiträge
 
Turbo Delphi für Win32
 
#1

Prozedur nach bestimmter Zeit abbrechen

  Alt 28. Dez 2008, 13:20
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!
Lennard
Der Vorteil der Klugheit besteht darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger. (Kurt Tucholsky)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Prozedur nach bestimmter Zeit abbrechen

  Alt 28. Dez 2008, 13:22
Nicht schön aber effektiv: Break; bzw. Exit; oder besser Schleife umbauen und Abbruchbedingung mit aufnehmen
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Prozedur nach bestimmter Zeit abbrechen

  Alt 28. Dez 2008, 13:22
Ja du kannst mit Exit; die Funktion verlassen!
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#4

Re: Prozedur nach bestimmter Zeit abbrechen

  Alt 28. Dez 2008, 13:31
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.
Uwe Raabe
  Mit Zitat antworten Zitat
Gentleman

Registriert seit: 29. Sep 2004
302 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Prozedur nach bestimmter Zeit abbrechen

  Alt 28. Dez 2008, 20:45
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.

Vielen Dank für die Hilfe, die Ansätze scheinen sehr vielversprechend, ich werde das mal in die Tat umsetzen.
Lennard
Der Vorteil der Klugheit besteht darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger. (Kurt Tucholsky)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Prozedur nach bestimmter Zeit abbrechen

  Alt 28. Dez 2008, 20:59
Das heißt, auf einem langsamen Rechner musst du dann mit halb bearbeiteten Daten und somit eventuell korrupten Daten klar kommen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#7

Re: Prozedur nach bestimmter Zeit abbrechen

  Alt 28. Dez 2008, 21:04
Na, wer wird denn so etwas vermuten?
Im Falle des Abbruchs erfolgt (natürlich) ein rollback
..... oder?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Prozedur nach bestimmter Zeit abbrechen

  Alt 28. Dez 2008, 21:09
anstelle immer wieder Encode... zu verwenden kannst du auch einfach GetTickCount verwenden.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#9

Re: Prozedur nach bestimmter Zeit abbrechen

  Alt 29. Dez 2008, 12:50
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#10

Re: Prozedur nach bestimmter Zeit abbrechen

  Alt 29. Dez 2008, 23:41
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:10 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