Delphi-PRAXiS
Seite 5 von 5   « Erste     345

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CriticalSections wie verwenden? (https://www.delphipraxis.net/156318-criticalsections-wie-verwenden.html)

Zacherl 21. Mai 2017 19:49

AW: CriticalSections wie verwenden?
 
CriticalSection macht keine Unterscheidung zwischen Read und Write. Der Block, den du absicherst, kann immer nur exklusiv ausgeführt werden.

ACHTUNG:
Jeder Thread (auch die nur Lesenden), der in irgendeiner Form auf den geschützten Speicherbereich zugreift, muss die selbe CriticalSection vorher betreten und nachher wieder verlassen.

Dementsprechend könnte dein Lese-Thread während eines Schreibzugriffes nicht gleichzeitig lesen. Auch könnten nicht mehrere Threads gleichzeitig lesen. Der bereits angemerkte Delphi-Referenz durchsuchenTMultiReadExclusiveWriteSynchronizer kann hier Abhilfe schaffen.

Zitat:

Zitat von SneakyBagels (Beitrag 1372244)
braucht man mit einer CriticalSection Synchronize(procedure bla.Caption := '123'; end); innerhalb eines Threads noch?

Ja, dein GUI Thread sollte ausschließlich
Delphi-Quellcode:
Synchronize
verwenden. Wenn - wie von dir beschrieben - die Worker-Threads alle eine eigene interne Liste haben und du die Daten eh per Message an den GUI Thread schickst, dann kannst du dir die CriticalSections sogar komplett sparen (vorrausgesetzt natürlich, dass die Message nicht nur Zeiger auf die eigentlichen Daten enthält - dann nämlich müsstest du im GUI Thread vor dem Zugriff die jeweils korrekte CriticalSection des sendenden Threads betreten).

SneakyBagels 21. Mai 2017 20:09

AW: CriticalSections wie verwenden?
 
Zitat:

ACHTUNG:
Jeder Thread (auch die nur Lesenden), der in irgendeiner Form auf den geschützten Speicherbereich zugreift, muss die selbe CriticalSection vorher betreten und nachher wieder verlassen.
Dementsprechend könnte dein Lese-Thread während eines Schreibzugriffes nicht gleichzeitig lesen.
Ich habe das eben mal geprüft. Meine Maßnahme bestand jetzt darin, dass ich meinen Code so optimiert habe, dass ich gar keine CriticalSection an dieser bestimmten Stelle mehr brauche.
Wird wohl die beste Möglichkeit sein, wenn man sie meiden kann. Interessant sind CS's aber schon!


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 Uhr.
Seite 5 von 5   « Erste     345

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