Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Synchronisation - CriticalSection? (https://www.delphipraxis.net/144520-synchronisation-criticalsection.html)

WorstNightmare 9. Dez 2009 15:58


Synchronisation - CriticalSection?
 
Hallo,

ein Teil eines Projekts von mir ist, wie mir letztens auffiel etwas schlampig geschrieben. Es gibt zwei Threads, die im Worst ( 8-) ) case dasselbe Eingabe-Formular öffnen und abfragen müssen. Dieses Problem könnte ich lösen, indem ich im Handler, der die Operationen mit diesem Formular verwaltet, eine CriticalSection global deklariere und sie in der Methode, die das Formular aufruft verwende, richtig?
Zusätzlich werden in allen möglichen Teilen und von allen möglichen Threads des Programmes Log-Funktionen aufgerufen, die in ein Memo schreiben. Kann ich da genauso mit einer CriticalSection arbeiten? Was kann eigentlich alles passieren, wenn ich das nicht tue und wirklich mal was exakt gleichzeitig aufgerufen wird? Ich höre immer, dass es nicht gut ist, habe aber eigentlich noch nie ein Beispiel gesehen, warum das so ist.

himitsu 9. Dez 2009 16:39

Re: Synchronisation - CriticalSection?
 
CriticalSections helfen hier garnichts.

Man ruft in einem Thread kein Formular oder irgendetwas von der VCL direkt auf!

Nutzte Synchronize, um auf die VCL/Formulare/Memos aufzurufen oder drauf zuzugreifen.

WorstNightmare 9. Dez 2009 17:04

Re: Synchronisation - CriticalSection?
 
Mh, gut. Aber wenn ich verhindern möchte, dass Code zur selben Zeit ausgeführt wird kann ich eine benutzen, oder?

Blup 10. Dez 2009 11:54

Re: Synchronisation - CriticalSection?
 
Zitat:

Zitat von WorstNightmare
Mh, gut. Aber wenn ich verhindern möchte, dass Code zur selben Zeit ausgeführt wird kann ich eine benutzen, oder?

Die Aufgabe von CriticalSections ist Codeabschnitte vor der gleichzeitigen Ausführung oder Speicherbereiche bzw. Variablen vor dem gleichzeitigen Zugriff aus verschiedenen Threads zu schützen.

himitsu 10. Dez 2009 12:12

Re: Synchronisation - CriticalSection?
 
Zitat:

Zitat von Blup
Die Aufgabe von CriticalSections ist Codeabschnitte vor der gleichzeitigen Ausführung oder Speicherbereiche bzw. Variablen vor dem gleichzeitigen Zugriff aus verschiedenen Threads zu schützen.

Jupp, mam muß dann einfach nur alle Lese-/Schreibzugriffe auf die entsprechenden resourcen mit diesen umschließen.
Es gibt aber auch noch andere Schutz-Varianten: z.B. TSimpleRWSync, welche etwas optimiert sind (gleichzeitiges Lesen erlaubt)

Die VCL hat ihre eigene ChriticalSection, an welche man extern nicht rankommt, aber dieses erledigt ja Synchronize für einen.

Delphi-Laie 9. Okt 2015 12:16

AW: Re: Synchronisation - CriticalSection?
 
Ich bitte um Nachsicht, daß ich meine Erfahrungen in diese alte Diskussion schreibe. Hätte ich diese Diskussion nicht gefunden, hätte ich wohl nach den kritischen Sektionen im Zusammenhang mit der Synchronisation gefragt.

Zitat:

Zitat von himitsu (Beitrag 978620)
Die VCL hat ihre eigene ChriticalSection, an welche man extern nicht rankommt, aber dieses erledigt ja Synchronize für einen.

Hängt von der Delphi-Version ab: Ein Blick in die Unit-Quelltexte (Classes.pas) verrät nicht nur, daß nahezu ständig am Synchronize-(Quell-)Code optimiert wurde, sondern auch, daß (erst?) ab Delphi 6 Synchronize mit kritischen Sektionen umhüllt ("geschützt") wird. Verläßlich stabil läuft es nach meiner Erfahrung aber ab Delphi 6 dennoch nicht. Entweder, man benutzt Compilate ab Delphi 7 oder bei Delphi 5 oder 6 eben im eigenen Quelltext zusätzlich umhüllende kritische Sektionen (bis Delphi 5 helfen nicht einmal die sicher).


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:22 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