Einzelnen Beitrag anzeigen

Edlmann

Registriert seit: 19. Nov 2010
212 Beiträge
 
#1

Thread will nicht synchron schwimmen?

  Alt 28. Okt 2011, 19:29
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
  Mit Zitat antworten Zitat