Event-Frage (Design-Frage)
-
Hallo zusammen,
im Moment stehe ich vor einem Problem, wofür ich keinen richtigen Lösungsansatz finde.
Ich habe eine Klasse FFT (sie berechnet eine FFT). Dazu liegen die Daten in einem Array, das Ergebnis liegt in einem anderen Array. Die Berechnung selbst wird durch einen Arbeits-Thread ereldigt. Ist dieser fertig, wird dies über ein Event an einen (oder mehrere) Kosumenten mitgeteilt (CalculationFinishedEvent).
Da das Ergenis wieder in einem Array liegt, wird diesem Event die Referenz auf dieses Ergenis-Array übergeben. Die Ereigniskonumenten kopieren sich dann jeweils die die Daten in ihren Eingangs-Puffer und teilen der FFT (per DataTransferFinishedEvent) mit, dass sie fertig sind. Die FFT-Klasse kann darauf hin neue Daten einlesen und berechnen. Das setzt sich im Prinzip laufend fort.Mein Frage bzw. mein Problem ist jetzt nur: Wie kann ich sicherstellen, dass die FFT-Klasse erst dann weitermacht, wenn alle nachfolgenden Ereigniskonsumenten die Daten kopiert haben.
Im Moment würde diese ja sofort weitermachen, wenn der Erste die Daten kopiert hat und das DataTransferFinishedEvent abgesandt hat. Ich will aber solange warten bis alle fertig sind. Wie kann man das am besten Lösen. Ist mein Ansatz über Events überhaupt dafür tauglich? Ich hoffe ich habe mein Problem einigermaßen deutlich beschreiben können.
Vieln Dank
Gruß
Kramny
-
scho nmal was von Semaphren gehört? müssest eigentlich, da du ja mit nem trhead arbeiteitest. Du kannst ja den arbeitsthead solange anhalten, bis die konsumenten fertig sind.
-
Hallo BorisDieKlinge,
Semaphoren sind mir ein Begriff - klar. Und vom Ansatz klingt Dein Vorschlag gar nicht schlecht.Aber:
- Der Arbeitsthread ist zu dem Zeitpunkt, wenn die "Konsumenten" die Daten kopieren bereits beendet (mit der Beendigung des Threads, wird das Event CalculationFinishedEvent ausgelöst).- Die Konsumenten kopieren die Ergebnisse (der Thread ist immernoch beendet) und senden ihrerseits das Event DataTransferFinishedEvent ab (Empfänger ist die FFT-Klasse). Jetzt können die Konsumenten etwas mit den Daten tun (z.B. in einem eigenen Thread diese verrechnen).
- Mit dem Eintreffen des DataTransferFinishedEvent in der FFT-Klasse können (z.B. aus einer Datei) neue Daten in die FFT-Klasse eingelesen werden und es wird ereneut der Arbeitsthread zur Berechnung gestartet.
Semaphoren würde ich verwenden, wenn ein konkurrierender Zugriff auf Resourcen stattfindet. Dies ist aber nicht gegeben, da beim kopieren der Daten kein Thread aktiv ist.
Von der Theorie habe ich so einiges mitbekommen. Allerdings bin ich in der praktischen Umsetzung von Threads (und deren Synchronisation) eher unerfahren. Deshalb wäre ich für weitere bzw. ergänzende und kritische Hinweise dankbar.
Gruß
Kramny
-
Wenn du weißt wieviele Konsumenten angeschlossen sind, dann brauchst du doch nur einen Zähler einfügen, der darauf wartet, daß jeder Konsument das DataTransferFinishedEvent gesendet hat.
-
dann beende den arbeitstrhead nie... seine berechnungsprozesse setzt in ne endlosschliefem. Der thread wir somit am ende des Progarmmes gekillt. Wenn die berechnung fertig ist schickst ein event an die kosnumenten, und setzt den arbeits trhead in ein freze Zustand... und wartest solange, bis alle konsumenten eine FERTIG event geschickt haben. dann kann die berechnung von neuem starten.
-
Wäre vielleicht Thread.join() was Du suchst?
Sebo