AGB  ·  Datenschutz  ·  Impressum  







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

CriticalSections wie verwenden?

Ein Thema von Bummi · begonnen am 28. Nov 2010 · letzter Beitrag vom 21. Mai 2017
 
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
781 Beiträge
 
#28

AW: CriticalSections wie verwenden?

  Alt 21. Mai 2017, 17:13
Angenommen ich erstelle 2 oder mehr Threads, die alle ein und das gleiche tun nur jeweils eine eigene Liste mit bestimmten Informationen haben.
Zur Anzeige schickt jeder Thread eine Message an einen anderen Thread (um diese Zeile Code ist aktuell ein CriticalSectionLocal.Enter und Leave drum), welcher ein Label ändert (diesen Thread gibt es nur 1x). In diesem GUI-Thread hole ich die Message mit GetMessage.
Soweit erstmal Horror-Code #1, ist mir aber egal und darauf BITTE nicht eingehen!

Die Frage lautet nun: bringt es irgendetwas eine globale CriticalSection VOR der Erstellung der 2 oder mehr Threads zu betreten und am Ende aller Arbeit wieder zu verlassen?
Somit würde ich doch jeder der 2+ Threads in dieser einen, globalen Critical Section befinden.
Oder sollte jeder Thread seine eigene, lokale CriticalSection haben? Daraus bin ich bis hier hin leider noch nicht schlau geworden.
Außerdem... braucht man mit einer CriticalSection Synchronize(procedure bla.Caption := '123'; end); innerhalb eines Threads noch?
Die CriticalSection um das ganze herum würde nur verhindern, dass das Ganze (Erstellern von 2+ Threads und abarbeiten) nicht ein zweites mal gleichzeitig gestartet werden kann.

Mit einer CriticalSection sperrst du eine globale Ressource (z.B.: globale Variable) für den Zugriff durch andere. Wenn du fertig bist, gibst du den Zugriff wieder frei. Wer zwischendurch drauf zugreifen will, muss warten. Stelle es dir einfach wie eine Toilette (= Ressource, die man i.d.R. alleine benutzen möchte) vor, das Türschloss ist die CriticalSection. Damit stellt man sicher, dass man alleine ist. Natürlich muss jeder, der die Toilette betritt, auch das Türschloss benutzen, sonst funktioniert es nicht (es darf auch keiner durch das Fenster einsteigen). Du hast in deinem Beispiel übrigens mehrere Leute in der Toilette eingeschlossen, und wartest bis alle Fertig sind, um sie wieder rauszulassen. Dabei sind sogar alle gleichzeitig am ******, was für eine Sauerei.

Wenn du allerdings auf VCL-Komponenten zugreifen willst brauchst du zwingend ein Synchronize oder du verschickst eine Message (SendMessage / PostMessage).

Geändert von Olli73 (21. Mai 2017 um 17:19 Uhr)
  Mit Zitat antworten Zitat
 


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 02:15 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-2025 by Thomas Breitkreuz