Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Synchronize, TCriticalSection oder sonst was??? (https://www.delphipraxis.net/29491-synchronize-tcriticalsection-oder-sonst.html)

romber 9. Sep 2004 18:22


Synchronize, TCriticalSection oder sonst was???
 
Hallo!

Ich erstelle in meinem Programm zwei verschiedene Threads. Beide Threads benutzen eine globale Funktion, die unter anderem Items in TListBox und TStringList hinzufügt. Die Threads werden mehrmals erstellt und warten in einer While-Shleife auf Terminate-Befehl. Das Hauptprogramm verwendet die o. g. VCL-Komponenten nur zum lesen. Den Zugriff von Threads auf VCL muss ich doch synchronisieren, oder? Was ist in meinem Fall richtig?

A) Die Funktion weiterhin wie o. g. aufrufen
B) Für jeden Thread eine Thread-eigene Funktion erstellen und den Berreich, in dem die Items hinzufügt werden, synchronisieren. Dann muss ich aber den Berreich in eine separate Procedure packen, um Synchronize aufrufen zu können, oder?
C) Das ganze wie in B, aber mit einer global definierter TCriticalSection und ohne separaten Procedure
D) Keine der Varianten. Was denn nun?

Danke!

Meflin 9. Sep 2004 18:36

Re: Synchronize, TCriticalSection oder sonst was???
 
eine criticalsection dürfte imho reichen, und zwar solltest du den vorgang wenn du die items in die listbox hinzufügst in die criticalsection packen da sonst wenn zwei threads gleichzeitig schreiben eine accessviolation entstehen wird.

supermuckl 9. Sep 2004 19:56

Re: Synchronize, TCriticalSection oder sonst was???
 
jep und zwar eine section für beide threads !

nicht jedem thread eine section geben.. das wäre dann wie ein ferrari ohne reifen ;)

romber 9. Sep 2004 20:11

Re: Synchronize, TCriticalSection oder sonst was???
 
Zitat:

Zitat von supermuckl
jep und zwar eine section für beide threads !

nicht jedem thread eine section geben.. das wäre dann wie ein ferrari ohne reifen ;)

Ich kann diese doch in der Mainform beim definieren und im OnCreate des Forms erstellen, oder?

supermuckl 9. Sep 2004 20:47

Re: Synchronize, TCriticalSection oder sonst was???
 
jep

müssen halt global sein die critical section(s)

weil erst wenn du mit 2 unterschiedlichen thread instanzen mit ein und derselben section synchronisierst funzt die sync
ansonsten kümmert sich die eine section um den einen thread und die andere um den anderen und dann ist nix gewonnen und es knallt beim gemeinsamen zugriff auf VCL objekte

( globale variablen müssen wohl nicht synchronisiert werden (a la Luckies thread irgendwo im board) )

also eine section createn

und beide oder halt mehrere threads dann damit synchronisieren lassen

thread xyz:

section.enter;
form1.listbox1.items.add bla bla
section.leave;

Sprint 9. Sep 2004 21:15

Re: Synchronize, TCriticalSection oder sonst was???
 
Zitat:

Zitat von supermuckl
globale variablen müssen wohl nicht synchronisiert werden

Ich weiß nicht ob es muss. Aber Delphi stellt dafür doch TMultiReadExclusiveWriteSynchronizer zur Verfügung.
Den benutze ich, wenn ich mit mehreren Thread's eine Variable lese und schreibe.

romber 9. Sep 2004 21:37

Re: Synchronize, TCriticalSection oder sonst was???
 
Zitat:

Zitat von Sprint
Ich weiß nicht ob es muss. Aber Delphi stellt dafür doch TMultiReadExclusiveWriteSynchronizer zur Verfügung.
Den benutze ich, wenn ich mit mehreren Thread's eine Variable lese und schreibe.

Auch für globale Integer-Variablen, wenn mehrere Threads den Wert ändern? Welchen Vorteil hat die TMultiReadExclusiveWriteSynchronizer gegenüber TCriticalSection?

Meflin 9. Sep 2004 21:39

Re: Synchronize, TCriticalSection oder sonst was???
 
wie der name des teils schon sagt regelt es dass mehrere threads die variable lesen, aber nur einer gleichzeitig ändern kann.


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