Ich habe eine Klasse, die ein Nachkomme von TThread ist. Ich habe einige öffentliche Eigenschaften, die nur gelesen werden können. Tritt es zu Problemen, wenn mein Haupt-Thread diese Werte liest, während der Thread aktiv ist?Deszendent von TThread, Zugriff auf Eigenschaften von Haupt-Thread
Antwort
Wenn Sie mit "Nur-Lese-Eigenschaften" meinen, dass der TThread-Nachfolger selbst diese nicht ändert und sie so schnell wie möglich initialisiert, dann wird alles in Ordnung sein (solange Sie sicherstellen, dass der Thread lebt und tritt immer dann auf, wenn Sie die Eigenschaftswerte anfordern).
Wenn Sie unter "Nur-Lese-Eigenschaften" meinen, dass der TThread-Nachfolger der einzige ist, der sie ändert, sollten Sie sicherstellen, dass der Hauptthread sie nicht liest, während sie geändert werden (es sei denn, sie sind atomare Werte) , wie ganze Zahlen).
Die Basistypen wie Integer
, Boolean
, Char
und Pointer
können jederzeit gelesen werden. Referenztypen wie string
, Schnittstellen und dynamische Arrays können nur dann gelesen werden, wenn keine Chance besteht, dass der andere Thread gleichzeitig einen neuen Wert zuweist. Verwenden Sie zum Beispiel einen kritischen Abschnitt oder die Methode Synchronized
, um sicherzustellen, dass der Thread den Wert nicht ändert, während der Hauptthread davon liest.
Sie müssen auch daran denken, dass jeder Wert, den Sie lesen, möglicherweise nicht mehr aktuell ist - der Thread hat möglicherweise einen neuen Wert zwischen dem Zeitpunkt, zu dem Sie ihn gelesen haben, und dem Zeitpunkt geschrieben.
Ich glaube, es heißt "Synchronize" (kein D am Ende) –
Das hängt von den Eigenschaftstypen und möglicherweise von ihren Zugriffsmethoden ab.
Der Zugriff auf diese Eigenschaft ist kein Problem, da der Zugriff auf 32-Bit-Werte eine atomare Operation ist. Wenn die Eigenschaft jedoch größer als 32 Bit oder eine Klassenreferenz ist, die möglicherweise geändert wird, während der Hauptthread darauf zugreift, treten Probleme auf.
- 1. Tomcat - Zugriff auf Eigenschaften von JSP
- 2. NSInternalInconsistencyException Zugriff auf _cachedSystemAnimationFence erfordert den Hauptthread
- 3. delphi - Beende alle Threads (TThread) auf schließende Anwendung
- 4. Zugriff auf nicht subscriptable Eigenschaften
- 5. Zugriff auf Eigenschaften von anonymen Typen in C#?
- 6. Zugriff auf Masterpage-Eigenschaften von untergeordneten Seiten in ASP.net VB
- 7. Problem beim Zugriff auf MAPI-Eigenschaften von C#
- 8. Zugriff auf Eigenschaften von Funktionsobjekten innerhalb des Funktionskörpers
- 9. Zugriff auf erweiterten Eigenschaften eines List-Klasse von JavaScript
- 10. Zugriff auf Eigenschaften von Objekten in einem NSSet
- 11. Zugriff auf Eigenschaften multimendional Array PHP von Javascript
- 12. Zugriff auf Eigenschaften von ziehbar Formen durch Code
- 13. Zugriff auf Viewmodel-Eigenschaften innerhalb von Listvew.Resources nicht möglich
- 14. Ausführen von Code auf dem Hauptthread von einem sekundären Thread?
- 15. Wie Hauptthread von Java erstellt
- 16. CSS Kind vs Deszendent Selektoren
- 17. Zugriff auf Controller-Eigenschaften über eine Ansicht
- 18. Zugriff auf weitere Projekte app.config Eigenschaften?
- 19. Zugriff auf Array von mehreren Threads
- 20. Zugriff auf in Logback programmierte Eigenschaften programmgesteuert
- 21. NSAttributeDescription, Zugriff auf die optionalen Eigenschaften
- 22. Zugriff auf WPF- und ViewModel-Eigenschaften
- 23. Zugriff auf Eigenschaften innerhalb einer Node4j Collection
- 24. php verhindern Eltern Zugriff auf untergeordnete Eigenschaften
- 25. JavaScript - Zugriff auf Eigenschaften nach (Schließung) .bind()
- 26. Hibernate Criteria API - Zugriff auf verknüpfte Eigenschaften
- 27. CoreBluetooth-Delegaten auf Hauptwarteschlange/Hauptthread?
- 28. Zugriff auf Eigenschaften über generischen Typparameter
- 29. Zugriff auf Maven-Eigenschaften mit Spring
- 30. nodeJs - Zugriff auf erforderliche Eigenschaften nicht möglich
Perfekte Antwort! Genau die Informationen, die ich brauchte. Ich aktualisiere die Werte innerhalb des TThread-Nachkommens und nicht alle Werte sind atomar. Vielen Dank für Ihre Antwort. –
und sogar "atomare" Werte wie Ganzzahlen können fehlschlagen, wenn Ihr Code nicht 32-Bit ausgerichtet ist. –
Indy enthält einige atomare Datentypen in Core \ IdThreadSafe.pas, einschließlich IdThreadSafeInt64 und sogar TIdThreadSafeBoolean – mjn