Threadsicherheit von AnsiString
-
Meine Suche in der Hilfe und im Forum hat dazu nix gefunden. Ich hab mal irgendwo gelesen, das in der Hilfe stehen würde, was aus der vcl Threadsicher ist und was nicht. Weis jemand wo? In diesme speziellen Fall interessiert mich der AnsiString aber wenns mal was anderes ist will ich net wieder Fragen.
-
aus der Hilfe:
Die Methode Execute stellt eine rein virtuelle Methode bereit, die den auszuführenden Code enthält.
virtual void __fastcall Execute(void) = 0;
Beschreibung
Überschreiben Sie diese Methode, und fügen Sie den Code des Threads ein, der ausgeführt werden soll. Execute übernimmt die Prüfung von Terminated und stellt dadurch fest, ob der Thread beendet werden muß.
Ein Thread wird ausgeführt, wenn TThread aufgerufen wird, während CreateSuspended den Wert false hat, oder wenn Resume zuerst nach dem Erzeugen des Threads aufgerufen wird, wobei CreateSuspended auf true steht.
Hinweis
Verwenden Sie die Eigenschaften und Methoden anderer Objekt nicht direkt in der Methode Execute eines Threads. Setzen Sie dazu einen separaten Prozedurenaufruf ein und rufen Sie diese Prozedur auf, indem Sie sie als Parameter an die Methode Synchronize übergeben.
allerdings ist das etwas mager ausgedrückt. Mehr hab ich jetzt auch nicht gefunden.
Wichtig ist, daß du nicht auf Ressourcen zugreifst, die von anderen Threads wie zum Beispiel den Hauptthread benutzt werden. Dann mußt du dieses Zugriffe synchronisieren.
Beispiel:
Du erstellst ein Thread. Im Thread möchtest du ein Formular öffnen, das den Status des Threads anzeigen kann.
Dann gilt:
1. Konstruktoren und Destruktoren müssen synchronisiert werden. Erstelle die Instanz im Thread- Objekt und zerstöre diese dort auch wieder.2. Im Objekt erzeugte Objekte (auch Formulare sind Objekte) brauchen nicht synchronisiert werden, da andere Threads auf diese Ressourcen nicht zugreifen können. Objektzugriffe auf Objekte die außerhalb des Threads instanziert wurden, müssen unbedingt synchronisiert werden.
3. Stack- Objekte ( wie AnsiString) brauchen sowieso nicht synchronisiert werden, da diese nur innerhalb einer Klasse oder einer Funktion gültig sind.
4. Globale Variablen, auf denen mehrere Threads zugreifen können sind zu vermeiden und müssen wenn es denn unbedingt notwendig ist synchronisiert wedern.Bedenke, das jeder Aufruf von Synchronize dein Thread ein Schritt näher zur Synchronität bringt. Wenn du ständig Synchronize aufrufst, kannste den Thread wegschmeißen.