-
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Breager,
20. Mär 2012
Ach so hast Du gemeint. Jo, da hast Du natürlich recht. :)
Danke für den Hinweis. Wie schon geschrieben: Threads sind absolutes Neuland für mich. Muss mehr querdenken.
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Breager,
20. Mär 2012
Der Gedanke dahinter war, dass ich bei Bedarf Codeabschnitte einschließen kann.
MyList.Locklist;
Dateiinfo:=Leseausdatei(MyList.Item.FileName); //Leseausdatei ist kein Bestandteil der Klasse
//Was passiert, wenn während der Leseausdatei Function gleichzeitig das MyList.Item über MyList.Delete(5) gelöscht wird.
Mylist.Item.Daten:=Dateiinfo; //Daten werden in falschen Item gespeichert....
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Breager,
20. Mär 2012
Ja, das habe ich jetzt konsequent in jeder Function und Procedure, wie beim Beispiel von Count, eingebaut:
Function TMyList.Count:Integer;
Begin
lock;
try
Result:=MyList.Count;
finally
unlock;
end;
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Breager,
19. Mär 2012
Alles klar :thumb: Danke, man lernt eben nie aus. Das Thema Threads wird mir noch die ein oder andere schlaflose Nacht bescheren (absolutes Neuland für mich) :roll:
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Breager,
19. Mär 2012
Wenn ich die CriticalSection über TMyList.Locklist starte, würde z.B. innerhalb von TMyList.Count ein erneuter Versuch, die CriticalSecion zu starten eine Ausführung des Codes in TMyList.Count blockieren.
Aus diesem Grund setze ich bei TMyList.Locklist MustLock:=False. Das bedeutet, dass ich z.B. innerhalb von Count keine CriticalSection mehr starten muss, da schon aktiv
IF MustLock then Lock...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Breager,
19. Mär 2012
Jo, danke. Hast recht, vertauscht ist besser (sicherer)!
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Breager,
19. Mär 2012
Da reicht sogar schon eine Millisekunde aus ;-) Hatte ich die letzten Tage mal selbst getestet. Hatte das ganz falsch verstanden. Dachte, das Enter wartet genauso wenig wie das TryEnter. Habs jetzt erstmal ohne Pollen umgesetzt.
Und zwar habe ich mir eine einfache threadsichere Klasse (mit CriticalSections) gebaut, die sich um alles kümmert. Ich weiss, dafür gibts die ThreadList, die fand ich...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Breager,
18. Mär 2012
TThreadlist hatte ich auch bereits gefunden. Allerdings fehlt dort Insert und Exchange oder habe ich etwas übersehen? Gut, das könnte man im Notfall noch selbst implementieren.
Ja, hast recht. Werde ich in Zukunft sofort einbauen.
EDIT: Das geht ja anscheinend doch. Muss ich mir nochmal gründlich unter die Lupe nehmen. Man lernt eben nie aus. Vielen Dank für den Hinweis.
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Breager,
18. Mär 2012
So, vielen Dank nochmal an alle. Ich habe nun alle wichtigen Operationen der TList (Add, Insert, Delete, Exchange, Clear) und natürlich das Umbenennen des Strings mit Hilfe von TCriticalSection in kritische Abschnitte gepackt. Die Performance ist nach wie vor gut.
Das kann ich im Moment leider nicht testen. Bin mir immer noch nicht sicher, ob ich nun pollen sollte oder nicht? Ist das vom...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Breager,
18. Mär 2012
Danke himitsu!
Das klingt nicht so gut :(
Hier mal ein Versuch, das ganze mit InterlockedExchange sicher zu machen:
Var ThreadString:AnsiString;
ThreadString_Locked:Integer;
...
ThreadString_Locked:=Integer(False);
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Breager,
17. Mär 2012
Danke Sir Rufo :-D
Habs gerade selbst getestet und gesehen, dass alles schön sauber nacheinander abgearbeitet wird.
Ich benutze in meinem Programm eine TList, dessen Items ich jeweils einen Record zuweise. Ein Bestandteil dieses Records ist die String-Variable (in meinem Beispiel ThreadStrg).
Jedes Bearbeiten der Liste (Add, Insert, Delete, Exchange, Clear) im Hauptthread und natürlich das...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Breager,
17. Mär 2012
Vielen Dank für Eure Antworten!
Mir brummt schon ganz schön der Schädel. Vielleicht warte ich doch lieber, bis der Thread beendet wurde ;-)
Brauche ich zum Lesen auch eine CriticalSection? Wird der Code innerhalb der CriticalSection in eine Warteschleife gelegt und später abgearbeitet oder einfach nicht ausgeführt/ignoriert? Letzteres wäre vorallem beim Lesen ungünstig.
Danke. Im Grunde...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Breager,
17. Mär 2012
Hallo,
ich hoffe, der Titel ist treffend. Ich habe eine Variable vom Typ String, die sowohl innerhalb eines Threads als auch außerhalb des Threads verändert werden kann. Die Wahrscheinlichkeit ist wohl sehr gering, aber ich befürchte, dass es theoretisch zu Problemen kommen könnte, wenn ich versuche, den Wert dieser Variablen gleichzeitig innerhalb des Threads und außerhalb des Threads zu...