Also, da ist einiges ziemlich schräg... *grins*
Fangen wir mal beim Thread selber an:
Delphi-Quellcode:
procedure TWorkerthread.Execute;
begin
while True do //<- wie schon mal gesagt: sollte while not Terminated do heissen...
begin
if HasJob then //<- nur als Anmerkung: mit ein paar einrückungen würde es leichter zum lesen gehen...
begin
Fin := False;
//Die eigentliche Berechnung
TParticleSystem(PSystem).Update; //<- und wo initialisierst du PSystem?
//das muss ja auf ein existierendes TParticleSystem
//verweisen, das auch mit .Create angelegt wurde!
//außerdem ist dein ASystem ja teil des Main-Threads,
//daher muss hier auf eine Synchronisation geachtet werden!
HasJob := false;
Fin := true;
end
else
Sleep(1);
end;
end;
gut, und dann wär da noch der Timer:
Vorneweg: So wie du das implementiert hast, wird der Timer wieder auflaufen, während du noch auf's abarbeiten des letzen wartest.
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var x: Integer;
d: Boolean;
begin
//Den Workerthread an seine Arbeit setzen
AWorker.SetJob(true);
//spätestens hier erzeugst du einen deadlock, weil der Thread und du auf das selbe ASystem zugreift.
if (OldX <> 0) and (OldY <> 0) and (MousePos_CB.Checked) then
ASystem.AddPartikels(OldX, OldY, Emit_SB.Position)
else
ASystem.AddPartikels(SizeX/2, SizeY/2, Emit_SB.Position);
Form1.Caption := 'Partiklesystem -- © by Edlmann -- ' + IntToStr(ASystem.Parts.Count) + ' Partikel';
//An dieser Stelle wird im Spiel dann die restliche Spiellogik geupdatet
//Auf den Thread warten
while AWorker.GetJob do
begin
sleep(1);
Application.ProcessMessages;
end;
//Nachdem der Thread seine Arbeit getan hat, Render die Partikel
Render(self, d);
end;
Ich empfehle dir den Workerthread-Thread, der weiter oben schon verlinkt ist, genau zu studieren. Hier fehlt eine sinnvolle Threading struktur (wer macht was wann und warum, was muss im vordergrund passieren, was im hintergrund und vor allem: was willst du mit deinem Thread bezwecken. Denn hier bleibt nur das Programm bedienbar, wenn du denn die Synchronisation korrigierst)
Dann solltest du genau schauen, welche Speicherbereiche aus welchem Kontext geschrieben werden - Stichwort Critical section.
So kann das auf alle Fälle nicht funktionieren!
Gruß
Luggi