AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Threadsynchronisation

Offene Frage von "blablab"
Ein Thema von blablab · begonnen am 22. Mär 2009 · letzter Beitrag vom 22. Mär 2009
Antwort Antwort
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#1

Threadsynchronisation

  Alt 22. Mär 2009, 17:05
Hallo!

Ich hab ne kleine Frage zur Threadsicherheit, hab das net so ganz verstanden.
Wenn ich zb im Hauptthrad auf eine Listbox zugreife (zb Lines.Add) und das auch in einem Thread mache, dann kann das ja zu Problemen führen. Aber wie ist das, wenn ich nur in einem Thread (nicht der Hauptthread) auf die ListBox zugreife und sonst nicht. Kann das auch zu Problemen führen?

Und wie ist es mit Lesen? kann ich in einem Thread zb auslesen ob eine ListBox Enabled ist oder sollte ich dafür auch Synchronize benutzen?

Danke schonmal!

Grüße
blablab
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Threadsicherheit

  Alt 22. Mär 2009, 18:55
Zitat von blablab:
Aber wie ist das, wenn ich nur in einem Thread (nicht der Hauptthread) auf die ListBox zugreife und sonst nicht. Kann das auch zu Problemen führen?
Ja, auf jeden Fall! Denn alle Steuerelemente "gehören" dem Hauptthread. Und wenn Deine ListBox angeklickt wird, bekommt der Hauptthread die Message, es darf also nicht gleichzeitig von einem anderen Thread zugegriffen werden.
Zitat von blablab:
Und wie ist es mit Lesen? kann ich in einem Thread zb auslesen ob eine ListBox Enabled ist oder sollte ich dafür auch Synchronize benutzen?
Ja, aus demselben Grund: wenn jemand im Moment Deines Lesezugriffs darauf klickt, geht das meist (aber nicht immer) schief. Also immer Synchronize benutzen, dann geht es der Reihe nach.

Grüße, Messie

[Edit]ich hab' mich ein wenig gewundert, warum vor mir niemand geantwortet hat. Der Titel "Threadsicherheit" trifft nicht ganz das Thema. Threadsynchronisation ist der Begriff: wie kann ich vermeiden, dass zwei Threads gleichzeitig auf etwas zugreifen und sich dann den Kopf aneinander stoßen[/Edit]
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Threadsicherheit

  Alt 22. Mär 2009, 18:56
Du MUSST dafür Synchronize nutzen. Alle Interaktionen mit der VLC müssen über den Hauptthread erledigt werden, deswegen Synchronize.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Threadsicherheit

  Alt 22. Mär 2009, 19:10
ohje, da komm ich mit neuen methoden und neuen globalen variablen erstellen gar net hinterher...

gibt es da nicht eine möglichkeit mir Synchronize auch parameter zu übergeben?


und nochmal zum verständnis, ich kann mir das irgendwie nicht vorstellen...
wie kann es denn vorkommen, dass während ich zb nen integer aulese, der verändert wird? Der integer wird doch in einem Schritt hingeschrieben und nicht erst die erste hälte und dann die zweite hälfte des integers. wie kann dann da n fehler auftreten?
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

Re: Threadsicherheit

  Alt 22. Mär 2009, 19:25
Zitat von blablab:
Der integer wird doch in einem Schritt hingeschrieben und nicht erst die erste hälte und dann die zweite hälfte des integers. wie kann dann da n fehler auftreten?
Wenn der Integer auf einer durch 4 Byte teilbaren Speicheradresse liegt, dann klappt das schon. Tut er das aber nicht, dann braucht der Befehl zwei RAM Zugriffe zum lesen. Und dazwischen ist es möglich, dass eine zweite CPU den zweiten Teil des Integers gerade neu beschreibt und man am Schluss ein Mischmasch aus altem und neuem Wert hat. (nur mal so als Beispiel)

Für Integer-Variablen braucht man aber nicht gleich zu Synchronize greifen. Hierfür gibt es die Interlock-Funktionen. InterlockIncrement, InterlockDecrement, InterlockExchange (kann man für die Zuweisung "misbrauchen"), ...
Des weiteren gibt es noch CriticalSections. Nur wenn man irgendwas mit der VCL (TForm, TControl, ...) anstellt ist der Weg über Synchronize notwendig, weil sämtliche Zugriffe auf Window-Handles, dank der Thread-Affinität, im Hauptthread/VCL-Thread auszuführen sind.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Threadsynchronisation

  Alt 22. Mär 2009, 19:34
Delphi sorgt bereits für korrektes ALignment (solange man kein packed o.Ä. verwendet), sodass es keine Probleme geben sollte, wenn ein Integer nur von einem Thread beschrieben wird.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz