![]() |
Synchronisierung von Subthreads (VCL) + Pointerzugriff
Hallo Leuts,
ich hab mal eine kleine Frage: Ich habe einen VCL-Thread dem ich (als Beispiel) einen Zeiger auf einen Boolan-Wert übergeben habe. So, nun einige Frage (insbesonderen an den Thread-Experten v.D. Luckie *g*): Kann ich einfach auf diesen Boolean-Wert aus dem Thread zugreifen? Wenn nein, wie kann ich das ganze Synchronisieren? Ich weis wie ich normale Prozeduren und Funktionen untereinander Synchronisiere, aber hier müsste ja eine Thread-Interne Prozedur Synchronisiert werden ... oder geht das genauso mit Synchronize??? EDIT: Und wenn wir schon dabei sind ... wie sieht das ganze mit einem TMemoryStream aus? Auf diesen wird allerdings !garantiert! nicht vom Hauptthread zugegriffen! (wird von mir gelockt) Aber das wars noch nicht, ich habe noch einen weitere Frage ... Wie kann ich zwei Nebenthreads miteinander Synchronisieren, ohne über den Hauptthread zu gehen? Diese beiden Thread sollen nämlich miteinander kommunizieren. mfG Markus |
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
Hallo,
eine Möglichkeit wären CriticalSections. Such mal in der Hilfe nach ![]() Gruß xaromz |
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
Für was? Den Variablenzugriff, den Threadzugriff oder beides ... ach ja, ich wusste gar nicht, dass das auch bei VCL geht^^.
mfG Markus |
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
Hallo,
Zitat:
// Anmerkung: Deshalb sollten diese Befehle auch sehr sparsam verwendet werden und der Code dazwischen kurz und effizient sein. Zitat:
Gruß xaromz |
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
Zitat:
|
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
So, noch eine Frage: Wie sieht die sache aus, wenn ich 100% sicherstellen kann,dass kein Zugriff auf die Eigenschaft erfolgt?
Kann ich dann darauf verzichten? Das Problem ist ganz einfach, dass ich einen TMemoryStream in eine Klasse im Hauptthread habe, die u.a. diesen Stream verwaltet. Eine leistungsintensive Aufgabe habe ich in einem seperaten Thread ... und dieser soll auf den MemoryStream zugreifen. Kann ich in dem Fall auf TCriticalSections verzichten? Die Klasse blockiert jeden Zugriff auf den Stream (von Auserhalb) während der Threadlaufzeit. mfG Markus |
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
Hallo,
Zitat:
Zitat:
Besser ist es immer, sich abzusichern. Und Fehler zu debuggen, die auf solche Konstrukte zurückzuführen sind, wünsch' ich meinem ärgsten Feind nicht :zwinker: . Gruß xaromz |
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
OK, das gehört zum Klassendesign, dass immer nur eine Aufgabe ausgeführt wird, solange wird ein Lock gesetzt, damit nicht verändert wird.
So noch eine wichtige Frage: Wie sieht das ganze bei einer Synchronisierung von zwei Subthreads untereinander aus? Muss das TCriticalSections dort auch als globale Variable vereinbart sein? Oder reicht es, wenn es in der Thread-Klasse des Kind-Threades als public vereinbart wird und somit dem Mama-Thread zu verfügung steht? Eine kurze Struktur meiner Idee: Hautpthread || Mama-Thread mit uses ClassKind-Thread | Kind-Thread mit TCriticalSections als Public Funktioniert das? mfG Markus |
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
So, noch eine Frage (nach der obigen, die noch nicht beantwortet ist):
Wie sieht die Sache umgekehrt aus? Wie greift der Hauptthread auf den Nebenthread zu? Critical Sections? Hat der Hauptthread auch ein Synchronize, oder muss ich hier zu Fuß Synchronisieren? mfG Markus |
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
Gemeinsam verwendete Resourcen/Variablen etc. sollten für den Zugriff grundsätzlich gekapselt werden, so etwa:
Delphi-Quellcode:
Wenn Du das als Get/Set-Methoden einer Eigenschaft implementierst, ist der Zugriff darauf sicher. Zum Verständnis: Eine Critical Section hält nicht etwa alle anderen Threads an, sondern sorgt dafür, das ein zweiter Aufruf von myCS.Enter so lange wartet, bis der erste Aufrufer myCS.Leave aufgerufen hat. Der erste Aufruf von myCS.Enter schließt sozusagen eine Tür von *innen*. myCS.Leave öffnet sie wieder.
Procedure ThreadsafeSetValue (aMyValue : TSomeType);
Begin myCS.Enter; Try fValue := aMyValue; // Na ja, fValue.Assign bei Objekten Finally myCS.Leave; End End; Procedure ThreadsafeGetValue (Var aMyValue : TSomeType); Begin myCS.Enter; Try aMyValue := fValue; Finally myCS.Leave; End End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz