Einzelnen Beitrag anzeigen

Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#15

Re: Abbrechen und auf Abbruch warten?

  Alt 29. Nov 2006, 19:45
Hallo Mattze,

das ist ganz sicher kein Delphi Bug.

Das Problem ist, dass die Prozedur die auf die Beendigung des Abbruchs wartet der Arbeitsprozedur keine Chance gibt zu Ende zu laufen. Das ist das Problem der Ereignis-Warteschleife.

Ich habe hier aber für dich eine Lösung, die nicht wesentlich aufwändiger ist - sie arbeitet mit einem Thread....

aber keine Panik. Ich habe einen Mini Thread, der sogar als universell zu benutzende Routine zur Verfügung steht (unit uThreadFrame) und die eigentliche Arbiet bleibt in deinem Mainform. Du darfst nur nicht auf VCL Elemente zugreifen - eventuell geht das sogar, ich habs nicht probiert.

Und so geht's

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    Abbruch: boolean;
    abgebrochen: boolean;
    procedure DoTheWork;
    procedure WorkEnde(Sender:TObject);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
uses
  uThreadFrame; // <---- hier steckt der Trick

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Abbruch := false;
  abgebrochen := false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  aThread: tFramingThread;
begin
  // Button 1 startet die Arbeit....

  // Worker Thread initialisieren
  aThread := tFramingThread.Create(true);
  aThread.ThreadBody := DoTheWork; // hier Prozedur zuweisen, die die Arbeit macht
  aThread.FreeOnTerminate := true; // wichtig
  aThread.OnTerminate := WorkEnde; // optional

  // und loslaufen lassen....
  aThread.Resume;

  label1.Caption := 'running';
end;

procedure TForm1.DoTheWork;
begin
  // hier wird gearbeitet.....

  Abbruch := false;
  while true do
  begin

    // Hier code für die Arbeit

    if Abbruch then
    begin
      abgebrochen := true;
      break;
    end;
  end;
end;

procedure TForm1.WorkEnde(Sender: TObject);
begin
  // wird am Ende der Arbeit aufgerufen, kann auch entfallen (siehe oben)
  if Abbruch then
  begin
    showmessage(inttostr(integer(abgebrochen)) + ' Abbruch');
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i: LongInt;
begin
  // der Abbruch Button ....

  abgebrochen := false;
  Abbruch := true;
  while not abgebrochen do
  begin
    sleep(1); // wichtig, damit der Thread zu Ende laufen kann.

    label1.caption := inttostr(i);
    inc(i);
    Application.ProcessMessages;
  end;
end;

end.
Viel Erfolg beim Ausprobieren.

Gruss
Angehängte Dateien
Dateityp: pas uthreadframe_183.pas (840 Bytes, 9x aufgerufen)
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat