S
Ok ich antworte mal stückchenweise und editiere dann immer. Es ist zu warm um am Stü ck zu denken.
@Ponto: Also genaugenommen ist in diesem Speziellen Fragefall SetText fiktiv. Der Grund warum ich frage ist eine eigene Klasse zur Kapselung von Daten. Ich verwende ein TListView zum Aneigen von DAten. Diese Daten werden durch eine Funktion hinzugefügt, die von externen Threads aufgerufen wird. Diese Funktion blockt über ein Synchobjekt dann erstmal den Zugriff auf TListView kurz. Die konkrete Problemstellung kam, weil ich zum Abspeichern meiner Daten einen eigenen Thread möchte. Nur wie sollte ich die DAten rüber bringen. Zum Einen bringe ich es irgendwie nicht fertig Objekte vom Typ TListItem oder TListItems ohne Owner zu erzeugen. Und da Das ganze Sowieso Anzeigeelemente in der VCL sind, dachte ich mir dann das ist sowieso nicht gerade die feine englische Anzeigeelemente als Datenspeicher zu missbrauchen.
Also habe ich jetzt eine Datenstruktur dazwischen gepackt. Das ist mal eben eine kleine Klasse, die ein TDateTime Objekt kapselt und 4 AnsiStrings. Aus dieser Klasse erzheuge ich nun ein Array als Datenspeicher. Genau genommen zwei Arrays. Während A mit Daten gefüllt wird von eben der Funktion die ich erwähnte, werden
zwei Zeiger von B an den Speicher Thread übergeben, der die Daten von B in eine Datei packt. Ok geht auch kurz.... Double Buffer... Einer wird gefüllt und von der Anzeige ausgelesen, einer wird zum Sichern ausgelesen
Das Füllen und von der Anzeige auslesen passiert im gleichen Thread (TForm). Das möcjhte ich dann, sicher ist sicher, eventuell mit einem TSynchObject oder TMultipleReadSingleWriteetcblabla sichern.
Aus diesem Grunde, und wegen anderen Programmteilen, frage ich hier. Ich möchte das Ganze allerdings allgemein halten und möglichst nicht Problembezogen. Denn ich denke, daß diese Frage viele beschäftigt. Meine Professoren haben immer gesagt hat EINER eine Frage, haben MEHRERE diese Frage.
Vielleicht entsteht hier die Grundlage für einen Artikel im Magazin. Denn im Web habe ich wirklich nciths zu dieser Thematik gefunden. Meine Bücher haben mir auch nicht wirklich etwas verraten.
Mit deiner Frage nach den GUIs hast du unbewusst ein weiteres meiner Probleme erwischt. In einer anderen Konstellation kämpfe ich auch mit der Problematik der Threadsicherheit. Auch dort geht es um die VCL. Ich habe ein TForm als grafische Visualisierung. Parallel dazu laufen diverse Threads. Die Threads stecken in einer Klasse. Ein Objekt dieser Klasse wurde in TForm definiert.
Nun habe ich diverse Threads. Die GUI eingeschlossen. Die Kommunikation erfolgt über ein Objekt einer Klasse, das die Adressen ALLER Threads übergeben bekommen hat. Will ein Thread einem anderen etwas sagen, so ruft er in dieser Klasse eine Funktion auf, die dann ein Post Message macht, ein SetEvent oder eben etwas an einem Element auf der GUI ändert. Das Einzige was darin bisher abgesichert wurde, sind die Set Events. Da existiert in jedem Thread ein SynchObject zu jedem Event.
Aber die Post Messages und die Änderungen an den GUI Elementen '(Beispielsweise eine Checkbox haken oder nicht haken) sind bisher nicht gesichert.
Diese Problemstellung ist der echte Grund für meine fragen. Denn da flitzen 4 oder 5 Threads in einer Funktion rum, die sagen wir mal 10 IF Entscheidungen drin hat. Die IFs haben als Bedingung eben einen Identifier, der die Threads dann in den Code der If reinlässt oder nicht.
Nur... Eine If ist doch auch wieder ein Lesezugriff oder? Muss ich doch auch sichern. (Wieder so ne Frage... Ihr seht.... Sowas ist ständig).
So die nächsten Posts lese ich anch dem Essen auch nochmal genau durch. Soweit ich beim Überfliegen gesehen habe habt ihr genau das getroffen was mein Problem ist.
Also wie ich bereits andeutete... Ein Artikel, unter Umständen auch gemeinsam erarbeitet, über die DOs n DON'Ts bei Zugriffen auf Variablen, Funktionen oder Klassenelementen wäre Klasse.