Ich habe ein kleines Problem mit den Delphi-Thread und insgesamt 2 Probleme:
-Das Handle ist ungültig
-Fehler bei der Bereichsprüfung, wenn die Werte größer als 2147483647 sind, ansonsten läuft das
oder
-Ungültige Gleitkommaoperation, wenn die werde bei etwa 10^15 liegen
Zu den Threads, was mir persöhnlich wichtiger ist:
Der Thread wird über Thread.Resume gestartet, wenn man einen Button drückt. Wenn man nach der Berechnung den Button noch einmal drückt, dann stürtzt das Programm ab und ich erhalte die erste Fehlermeldung.
In Form.Create initialisere ich den Thread:
[PASCAL]
procedure TForm1.FormCreate(Sender: TObject);
begin
Berechnen := Rechnen.Create(True);
//True, wenn der Thread noch nicht ausgeführt werden soll
//False, wenn er ausgeführt werden soll
Berechnen.FreeOnTerminate := True;
//Wenn die Prozedur EXECUTE durch ist, wird der Speicher frei
end;
[/PASCAL]
Das sind meine Kopfinfos:
[PASCAL]
Rechnen = class(TThread)
protected
procedure Execute; override;
public
end;
var
Form1: TForm1;
Event: TEvent;
Berechnen : Rechnen;
[/PASCAL]
Rechnen.Execute sieht so aus:
[PASCAL]
procedure Rechnen.Execute;
begin
while(not Terminated) do
begin
//Form1.Panel1.Caption := 'in While';
if(Event.WaitFor(100) = wrSignaled) then
begin
//Form1.Panel1.Caption := 'in Event';
try
Form1.Panel1.Caption := 'Pi: ' + FloatToStr(MonteCarlo());
Berechnen.Terminate;
except
on e: exception do
begin
showmessage('Fehler: ' + e.Message);
end;
end;
end;
end;
end;
[/PASCAL]
Die MonteCarlo Funktion, die die unteren beiden Fehler hervorbringt, sieht so aus:
[PASCAL]
function MonteCarlo () : real;
var arrog : integer; x, y : single; z, detail, i, treffer : real;
begin
detail := StrToFloat(Form1.Edit1.Text);
detail := round(detail);
if detail > 2147483647 then arrog := 2147483647
else arrog := round(detail);
setLength(xarr, arrog);
setLength(yarr, arrog);
//2147483647
i := 0;
treffer := 0;
while i <= detail do
begin
x := random;
y := random;
z := x*x+y*y;
if i <= 2147483647 then
begin
xarr[round(i)] := x;
yarr[round(i)] := y;
end;
i := i+1;
if z <= 1 then treffer := treffer+1;
end;
result := 4*(treffer/detail);
end;
[/PASCAL]
xarr und yarr sind Single-Arrays, die später die Koordinaten, die zufällig ausgewählt wurden auf ein Bild zeichnen. Nur mal so am Rande: Kann ich mit 2 Threads in ein Bild gleichzeitig zeichnen?
Falls ihr noch Hinweise, Fragen oder sonst noch irgendetwas habt, dann bin ich dafür immer offen.
-Das Handle ist ungültig
-Fehler bei der Bereichsprüfung, wenn die Werte größer als 2147483647 sind, ansonsten läuft das
oder
-Ungültige Gleitkommaoperation, wenn die werde bei etwa 10^15 liegen
Zu den Threads, was mir persöhnlich wichtiger ist:
Der Thread wird über Thread.Resume gestartet, wenn man einen Button drückt. Wenn man nach der Berechnung den Button noch einmal drückt, dann stürtzt das Programm ab und ich erhalte die erste Fehlermeldung.
In Form.Create initialisere ich den Thread:
[PASCAL]
procedure TForm1.FormCreate(Sender: TObject);
begin
Berechnen := Rechnen.Create(True);
//True, wenn der Thread noch nicht ausgeführt werden soll
//False, wenn er ausgeführt werden soll
Berechnen.FreeOnTerminate := True;
//Wenn die Prozedur EXECUTE durch ist, wird der Speicher frei
end;
[/PASCAL]
Das sind meine Kopfinfos:
[PASCAL]
Rechnen = class(TThread)
protected
procedure Execute; override;
public
end;
var
Form1: TForm1;
Event: TEvent;
Berechnen : Rechnen;
[/PASCAL]
Rechnen.Execute sieht so aus:
[PASCAL]
procedure Rechnen.Execute;
begin
while(not Terminated) do
begin
//Form1.Panel1.Caption := 'in While';
if(Event.WaitFor(100) = wrSignaled) then
begin
//Form1.Panel1.Caption := 'in Event';
try
Form1.Panel1.Caption := 'Pi: ' + FloatToStr(MonteCarlo());
Berechnen.Terminate;
except
on e: exception do
begin
showmessage('Fehler: ' + e.Message);
end;
end;
end;
end;
end;
[/PASCAL]
Die MonteCarlo Funktion, die die unteren beiden Fehler hervorbringt, sieht so aus:
[PASCAL]
function MonteCarlo () : real;
var arrog : integer; x, y : single; z, detail, i, treffer : real;
begin
detail := StrToFloat(Form1.Edit1.Text);
detail := round(detail);
if detail > 2147483647 then arrog := 2147483647
else arrog := round(detail);
setLength(xarr, arrog);
setLength(yarr, arrog);
//2147483647
i := 0;
treffer := 0;
while i <= detail do
begin
x := random;
y := random;
z := x*x+y*y;
if i <= 2147483647 then
begin
xarr[round(i)] := x;
yarr[round(i)] := y;
end;
i := i+1;
if z <= 1 then treffer := treffer+1;
end;
result := 4*(treffer/detail);
end;
[/PASCAL]
xarr und yarr sind Single-Arrays, die später die Koordinaten, die zufällig ausgewählt wurden auf ein Bild zeichnen. Nur mal so am Rande: Kann ich mit 2 Threads in ein Bild gleichzeitig zeichnen?
Falls ihr noch Hinweise, Fragen oder sonst noch irgendetwas habt, dann bin ich dafür immer offen.