Hey
DP,
Ich versuche grad zum xten Mal, mein Projekt Shapewars auf eine Multithread-anwendung umzustellen. Hierfür möchte ich zunächst die Partikeleffekte und deren Berechnung in einen Thread auslagern. Hierfür hab ich mir einen eigenen TThread abgeleitet, im Moment mit folgendem Code:
Delphi-Quellcode:
type
TWorkerthread = class(TThread)
private
protected
procedure Execute; override;
public
procedure SetJob(Val: Boolean);
function GetJob: Boolean;
end;
var
Fin, HasJob: Boolean;
implementation
uses Main;
function TWorkerthread.GetJob: Boolean;
begin
NotifText := BoolToSTr(Fin, true);
NotifTime := 100;
Result := not Fin;
end;
procedure TWorkerthread.SetJob(Val: Boolean);
begin
HasJob := Val;
end;
procedure TWorkerthread.Execute;
begin
while True do
begin
if HasJob then
begin
Fin := False;
// Wenn Partikel eingeschaltet sind
if RenderPartikel then
begin
MovePartikel;
end;
HasJob := false;
Fin := true;
end
else
Sleep(1);
end;
end;
Die Variable Fin hab ich erstmal nur eingeführt, um zu schauen ob er so macht was er soll. Der Thread ist also eine Endlosschleife, die immer wieder nachschaut ob sie die Partikel wieder um einen Schritt weiterbewegen soll (Geschiet mittels MovePartikel) oder eben nicht. Jeden Frame soll also optimalerweise einmal ein Job ausgeführt werden. Nun möchte ich in der Hauptschleife des Spiels (Die über den
VCL-Thread läuft) auf die Fertigstellung des Jobs warten, und zwar mittels
Delphi-Quellcode:
while AWorker.GetJob do
begin
sleep(1);
Application.ProcessMessages;
end;
Wobei AWorker mein Thread ist. Allerdings erscheint so die Form gar nicht mehr, ich muss das Spiel über den TaskManager killen, und lass ich es erst laufen bleibt die Prozessorauslastung bei 0 (also warten beide Thread gerade...), doch anscheinend kommt er aus der Schleife nicht vernünftig wieder raus -.-"
Ich hoffe mir kann jemand weiterhelfen, bin auch nach mehreren Tutorials zu Threads auf keine Lösung gestoßen,
Lg,
Edlmann