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