Hallo
Ich habe ein Programm geschrieben, welches die Harmonische Reihe bis zu einem bestimmten Wert berechnet. Die Berechnung wird in einem Thread ausgeführt. Das berechnen und ausgeben klappt auch prima, jedoch wenn ich das Programm beende kommt eine Fehlermeldung: "Zugriffsverletzung"
Delphi-Quellcode:
type
TMyThreads = class(TThread)
private
procedure UpDate;
protected
procedure Execute; override;
public
Ergebnis: Real;
Zaehl, Reps : Integer;
end;
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
Button3: TButton;
Label1: TLabel;
Edit1: TEdit;
ProgressBar1: TProgressBar;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private-Deklarationen }
ThreadArray: array of TMyThreads;
public
{ Public-Deklarationen }
procedure Update(Durchlauf,Reps : Integer; Ergebn: Real);
end;
var
Form1: TForm1;
Reps : Integer;
StartZeit : TTime;
Prozent : Real;
implementation
{$R *.dfm}
procedure TMyThreads.Execute;
var
Loop : Integer;
begin
for Loop := 1 to Reps do
begin
Ergebnis := Ergebnis + 1/Loop;
Zaehl := Loop;
Synchronize(Update);
end;
Application.MessageBox('Fertig!','Info', 0+64);
Destroy;
end;
procedure TMyThreads.UpDate;
begin
Form1.Update(Zaehl, Reps, Ergebnis);
end;
procedure TForm1.Update(Durchlauf,Reps : Integer; Ergebn: Real);
var aktZeit, GesZeit : TTime;
begin
Memo1.Lines.Add(FloatToStr(Ergebn));
Label1.Caption := 'Durchlauf: ' + IntToStr(Durchlauf);
ProgressBAr1.Position := Durchlauf;
aktZeit := Now;
GesZeit := aktZeit-StartZeit;
Label2.Caption := TimeToStr(geszeit);
Prozent := 100 / (Reps / Durchlauf);
Label3.Caption := FormatFloat('0%',Prozent);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
StartZeit := Now;
Reps := StrToInt(Edit1.Text);
ProgressBar1.Max := Reps;
Setlength(ThreadArray, 1);
ThreadArray[1] := TMyThreads.Create(True);
ThreadArray[1].Ergebnis := 0;
ThreadArray[1].Reps := Reps;
ThreadArray[1].Resume;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if ThreadArray[1].Suspended then
ThreadArray[1].Resume
else
ThreadArray[1].Suspend;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.DoubleBuffered := true;
Form1.Doublebuffered := true;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//ThreadArray[0].Terminate;
end;
end.
Ich denke es liegt an der Art wie der Thread beendet wird.
Ich häng den kompletten Delphi-Source mal mit an, vielleicht hilfts ja.
Johannes