Forum: Sonstige Fragen zu Delphi
Delphi
by Tryer,
27. Mär 2010
Die Instanz liegt im Speicher, nicht im Threadkontext. Und alle deine Threads haben Zugriff auf den Speicher, man muss halt nur schauen das die Zugriffe geortnet ablaufen. Das wird über Synchronisierungsobjekte wie TCriticalSection oder das in TTread implementierte Synchronize durchgeführt. Synchronize legt prinzipiell die Adresse der Prozedur welche der Mainthread aufrufen soll in einer Liste ab...
Forum: Sonstige Fragen zu Delphi
Delphi
by Tryer,
26. Mär 2010
Die Kommunikation mit der Peripherie sollte in einem eigenen Thread laufen welcher dann Add() aufruft. Immer wenn eine Funktion aufgerufen wird dann findet das immer im Kontext des aufrufenden Threads statt, also in einem anderen Thread als das Execute() läuft und unabhängig davon welcher Thread das Objekt erstellt hat. Solange der Kommunikationsthread (für den ich eine erhöhte Priorität...
Forum: Sonstige Fragen zu Delphi
Delphi
by Tryer,
25. Mär 2010
repeat
if WaitForSingleObject(FDataClass.NewDataEvent, 100) = WAIT_OBJECT_0 then
begin
PData := FDataClass.ExtractFirst;
if Assigned(PData) then
begin
repeat
try
Verarbeite(PData^);
finally
Forum: Sonstige Fragen zu Delphi
Delphi
by Tryer,
25. Mär 2010
Sorry, muss natürlich vom Typ THandle (bzw. Cardinal) sein. Und natürlich heißt es "constructor Create(..)" in der Implementierung. Schreibfehler halt ;)
Mit dem Event(siehe Hilfe zu CreateEvent) werden die gerade arbeitslosen, wartenden Worker aktiviert um sich die Daten abzuholen.
Das ganze ist natürlich so ausgelegt das der Worker sich einfach den Job holt der am längsten in der DataClass...
Forum: Sonstige Fragen zu Delphi
Delphi
by Tryer,
25. Mär 2010
Speicherst Du entweder die Zeichenkette oder die Realwerte? Die Vermischung finde ich unübersichtlich, aber diesbezügich kannst Du das ganze ja selber anpassen.
"Mal eben", also garantiert nicht fehlerfrei:
type
POneData = ^TOneData;
TOneData = record
Zeichenkette: string;
Value1: Double;
Value2: Double;
Value3: Double;
Value4: Double;
Forum: Sonstige Fragen zu Delphi
Delphi
by Tryer,
25. Mär 2010
"Passieren" müsste die Freigabe natürlich durch den Arbeiter wenn er mit dem Element fertig ist. Aber bei mehr als einem Arbeiter bietet sich eine bessere (weil nicht starr im Speicher ausgerichtete) Lösung an: Die gute alte einfach verkettete Liste. Der Sammler hängt ans letzte Element an und die Arbeiter nehmen sich immer das erste Item aus der Liste. Der Sammler erstellt das Item, der Arbeiter...
Forum: Sonstige Fragen zu Delphi
Delphi
by Tryer,
24. Mär 2010
Ich habe das Problem mal wie folgt gelöst:
Beide Threads ("Sammler" und "Arbeiter") haben je eine TList.
Der Sammler füllt fleissig seine Liste und setzt einen Event über den der Arbeiter erkennt das neue Daten vorliegen (WaitForSingleObject). Dann tauscht er seine abgearbeitete, leere Liste per FWorkList := TList(InterlockedExchange( Integer(FSammler.FList), Integer(FWorkList))); mit dem...