Einzelnen Beitrag anzeigen

grl

Registriert seit: 5. Feb 2007
174 Beiträge
 
FreePascal / Lazarus
 
#12

AW: Thread will nicht synchron schwimmen?

  Alt 30. Okt 2011, 15:12
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
  Mit Zitat antworten Zitat