Einzelnen Beitrag anzeigen

Edlmann

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

AW: Thread will nicht synchron schwimmen?

  Alt 30. Okt 2011, 20:01
@grl: Vielen Dank schonmal für dein Feedback,
Gern!

doch ich glaube wir reden aneinander vorbei...
Ich glaub nicht - denn egal was du auch erreichen willst - das was du da zusammengebastelt hast, kann nicht funktionieren.

Das was ich da zusammengebastelt hab ist nur ein Programm, in dem mein Problem demonstriert werden soll...Das ich vergessen hab das System zu initialisieren ist ein Flüchtigkeitsfehler, der beim zusammenkopieren entstanden ist...werds mal eben überarbeiten. Hab u.a. auch eine ältere Version der Workerthreads benutzt, in der ich das True noch nicht geändert hatte...

Der Thread soll parallel zum VCL-Thread arbeiten, so dass der VCL-Thread die GameEngine übernimmt, und der Workerthread die Partikel berechnet (zumindest vorerst, vllt wenn ichs iwann mal hinbekommen hab noch mehr Threads).
Dann hab ich dich schon richtig verstanden. Das machst du hier aber nicht - denn du wartest auf den Thread und damit läuft er nicht parallel.
Mal dir das mal auf - in einem Ablaufdiagramm oder so - dann siehst du das besser.


Das mit dem Timer stimmt auffallend, hatte ich bisher noch nicht richtig drüber nachgedacht...was wäre denn eine bessere Möglichkeit das zu implementieren? Die Zeit, die für die Berechnungen in Anspruch genommen wird nehmen, und nur warten falls diese niedriger als 16,666ms (=> 1 Frame pro Sekunde) ist?
Wenn du das mit Multithreading machen willst (was schon gescheit sein könnte) dann würde ich einen Thread bauen, der sich selbsttätig um die Berechnung kümmert und unabhängig ist vom Mainthread. Der Mainthread macht dann nur noch die Anzeige.

Dabei musst du aufpassen, daß du sauber getrennte Speicherbereiche verwendest oder die Zugriffe über eine CriticalSection schützt. Das ist jetzt auch das Problem warum du da nicht weiterkommst. Du schreibst einfach aus beiden Threads auf den selben speicher - das geht nicht.

Lade grad eine aktualisierte Version der Demo hoch, sollten die gröbsten Dinge gefixxt sein, funktioniert aber noch immer nicht so wie ich will...Link ist der selbe wie oben.
Nein, da ist vom wirklichen Problem nix gefixt.

Folgendes solltest du jetzt tun:
- überlege dir eine klare Trennung der Speicherbereiche. Daß du auf ASystem aus dem MainThread und aus dem WorkerThread zugreifst ohne das zu Synchronisieren (CriticalSection!) ist ein absolutes NoGo und wird nie funktionieren!!!
- Trenne klar, was welcher Thread machen muss und vermeide, daß einer auf den anderen warten muss - damit führst du das Konzept des Multithreading ad absurdum.
- Überlege dir klare Schnittstelle zwischen den beiden Teilen. z.B eine Liste der Partikel, aus der jeder Thread eines entnimmt, es bearbeitet (also berechnet/anzeigt) und es wieder zurückgibt. Das entnehmen und zurückgeben schützt zu mit einer CriticalSection. Damit ist sichergestellt, daß du nie zugleich auf eines zugreifst.

Gruß
Luggi
Ich verstehe nicht an welcher Stelle ich aus beiden Threads etwas zugreifen soll...Der VCL-Thread berechnet die Spiellogik, der Worker die Partikel-Engine (VCL-Thread greift nicht auf die Partikel zu), nur beim Rendern liest der VCl-Thread die Werte der Partikel aus, ändert diese aber nicht. Auf den Workerthread warten hab ich eingebaut, damit der Worker auf jeden Fall beim nächsten Frame fertig mit seinem Durchlauf ist, und wieder weiter arbeiten kann. Da der Mainthread im Spiel genug zu tun hat bis dahin, sollte diese Warteschleife im Spiel nur selten aufgerufen werden, doch das schützt (zumindest in meiner eigenen kleinen Welt, in der Threads funktionieren wie ich denke ) davor, dass Einzelschritte übersprungen werden beim Partikelsystem.
  Mit Zitat antworten Zitat