AGB  ·  Datenschutz  ·  Impressum  







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

Wie Procedure abbrechen

Ein Thema von Insider2004 · begonnen am 5. Mär 2005 · letzter Beitrag vom 5. Mär 2005
Antwort Antwort
Seite 1 von 2  1 2      
Insider2004
(Gast)

n/a Beiträge
 
#1

Wie Procedure abbrechen

  Alt 5. Mär 2005, 17:21
Ich habe eine Procedure mit Schleife, die etwas macht (z.B. eine Berechnung, die 1 Minute braucht).
Desweiteren möchte ich einen Button haben, mit dem ich die Berechnung abbrechen kann. Wie kann ich das machen?
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Wie Procedure abbrechen

  Alt 5. Mär 2005, 17:22
Innerhalb einer for-Schleife kann man mit Break; die Schleife verlassen. Prozeduren beendet man mitExit; MfG
Binärbaum
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Wie Procedure abbrechen

  Alt 5. Mär 2005, 17:24
Weitere Hinweise:
In der Schleife:
Application.ProcessMessages
Und eine globale Variable abfragen, die durch das Drücken des Buttons gesetzt werden. Kann natürlich eine Variable im Objekt TForm sein.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Wie Procedure abbrechen

  Alt 5. Mär 2005, 17:25
Hi,

du packst eine Variable "FAborted: Boolean" in den Private-Abschnitt Deines Forms.

Die Schleife sieht dann z.B. so aus:
Delphi-Quellcode:
// Vorher auf false setzen!
FAborted := False;
for i := 0 to 2323324 do
begin
  // ...
  Application.ProcessMessages;
  if FAborted then Break;
end;
Schleifen abbrechen kannst Du mit Break (bei repeat oder while Schleifen, solltest Du es aber über die Abbruchbedingung der Schleife selbst tun!), Prozeduren mit Exit.

In am Abbrechen Button schreibst Du nun
FAborted := True; mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#5

Re: Wie Procedure abbrechen

  Alt 5. Mär 2005, 17:26
Warscheinlich musst du hin und wieder in der Schleife
Application.ProcessMessages; aufrufen, damit das Programm die Message beim Klick verarbeitet.


MfG Pr0g
  Mit Zitat antworten Zitat
Insider2004
(Gast)

n/a Beiträge
 
#6

Re: Wie Procedure abbrechen

  Alt 5. Mär 2005, 17:36
Danke soweit! Allerdings habe ich noch etwas:

1.Problem:
Das Application.ProcessMessages; ermöglicht meiner Application, dass ich den Abbruch-Button drücken kann. Dieser ist aber sehr schlecht "zu erreichen". D.h. die meiste Rechenzeit wird in der Schleife verbraucht. Wie kann ich dem Abbruch-Button sozusagen mehr Zeit geben?

2. Problem
Das Application.ProcessMessages; macht es möglich, dass meine Procedure nochmals von "hinten" aufgerufen wird. Wie vermeide ich diese Rekursion?


procedure TForm1.OnButtonClick;
begin
for i := 0 to 2323324 do
begin
// ...
Application.ProcessMessages;
if FAborted then Break;
end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Wie Procedure abbrechen

  Alt 5. Mär 2005, 17:39
Deaktivier den Button nach dem man draufgeklickt hat.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Wie Procedure abbrechen

  Alt 5. Mär 2005, 17:40
Zitat von Insider2004:
2. Problem
Das Application.ProcessMessages; macht es möglich, dass meine Procedure nochmals von "hinten" aufgerufen wird. Wie vermeide ich diese Rekursion?


procedure TForm1.OnButtonClick;
begin
for i := 0 to 2323324 do
begin
// ...
Application.ProcessMessages;
if FAborted then Break;
end;
end;
Hi,

setze eine weitere Boolean Variable ein, die Du am Anfang der Procedure auf TRUE setzt und am Ende auf FALSE.

z.B.
Delphi-Quellcode:
procedure TForm1.Button1Click;
begin
  if (FRunning) then
    Exit;
  FRunning := True;
  for i := 0 to 2323324 do
  begin
    // ...
    Application.ProcessMessages;
    if FAborted then Break;
  end;
  FRunning := False;
end;
mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Wie Procedure abbrechen

  Alt 5. Mär 2005, 17:43
Zitat von Insider2004:
2. Problem
Das Application.ProcessMessages; macht es möglich, dass meine Procedure nochmals von "hinten" aufgerufen wird. Wie vermeide ich diese Rekursion?

Delphi-Quellcode:
procedure TForm1.OnButtonClick;
begin
  for i := 0 to 2323324 do
    begin
      // ...
      Application.ProcessMessages;
      if FAborted then Break;
    end;
end;
Wenn der Button einmal gedrückt wurde, kann man die Eigenschaft Enabled des Buttons auf False setzen und am Ende der Prozedur wieder auf True:
Delphi-Quellcode:
procedure TForm1.OnButtonClick;
begin
  Button1.Enabled:= False;//Button1 gesperrt
  for i := 0 to 2323324 do
    begin
      // ...
      Application.ProcessMessages;
      if FAborted then Break;
    end;
  Button1.Enabled:= True;//Button1 wird wieder aktiviert
end;
MfG
Binärbaum
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Wie Procedure abbrechen

  Alt 5. Mär 2005, 18:04
Ich würde empfehlen, die langwierige Berechnung in einen seperaten Thread zu verlagern. Das hat den Vorteil, dass du durch die Priorität besser die Rechnerauslastung rgulieren kannst.
Und außerdem ist die Reaktionszeit zwischen des Klickens des Stop-Button und des eigentlichen Stopps geringer.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  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 20:57 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