Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi CriticalSection offen? (https://www.delphipraxis.net/46417-criticalsection-offen.html)

Meflin 24. Mai 2005 20:17


CriticalSection offen?
 
Moin,

folgendes Szenario: ich habe mehrere Threads, die Daten generieren und diese, wenn sie eine bestimmte Menge generiert haben, auf einen Stack legen. Dazu verwende ich natürlich eine CriticalSection, da ja alle Threads auf einen Stack zugreifen.

Nun habe ich mir überlegt, dass es sinnvoll wäre die Daten nur auf den Stack zu legen, wenn dies gerade kein anderer tut, und ansonsten weiterzugenerieren. Sonst wartet ja der Thread, bis die CriticalSection frei wird und betritt sie dann. Es ließe sich also Zeit sparen und die Performance erhöhen.

Nun die Frage: wie kann man raus finden, ob die CriticalSection betreten werden kann, oder nicht?


alzaimar 24. Mai 2005 21:06

Re: CriticalSection offen?
 
Das geht nicht, weil:
CS ist frei.
Thread A fragt und bekommt die Antwort "CS ist Frei" ( :bounce2: )
Thread B fragt und bekommt die Antwort "CS ist Frei" ( :bounce2: )
Thread A geht in die CS rein. :tongue:
Thread B auch-> :wall:

Die 'critical sections', also die Programmteile, die geschützt werden, musst Du zu kurz wie möglich halten. Bei einem Stack sehe ich da keine Probleme. Die paar ASM-Befehle machen den Kohl nicht fett.

brechi 24. Mai 2005 22:02

Re: CriticalSection offen?
 
ausserdem hat jeder thread nen eigenen stack (also meinst du nicht diesen [ESP]).
hast du einen eigenen stack programmiert? wenn ja wie arbeitet der? über verkette listen oder so? dann musst du definitiv critical section benutzen um ein element der liste hinzuzufügen
du könntest aber auch eine variable setzen die du dann in jedem thread abfragst ob diese falsch ist, wenn ja kannste sie in dem thread auf war setzen und elemente hinzufügen -> solltets du fertig sein setze sie wider auf falsch

du kannst dann gefahr los in jedem thread idese vriable auslesen und gegebenfalls weiterarbeiten wenn das gerade beutzt wird
du hast dann den vorteil,wenn du es nicht so machsen würdest, dass beim hinzufügen eine elementes was in einer critical section gemacht wird alle anderen threads warten müssten und je nach dauer des hinzufügens warten alle anders
genau das wollteat damit ja beheben.

solltest du aber trotzdem den stack (ESP) meinen, da frage ich mich wie du da überhaupt was drauflegen willst :> jedefnalls hat da jeder thread nen eigenen

Basilikum 24. Mai 2005 22:49

Re: CriticalSection offen?
 
schau Dir mal MSDN-Library durchsuchenTryEnterCriticalSection an

alzaimar 25. Mai 2005 09:21

Re: CriticalSection offen?
 
Mit TryEnterCriticalSection gehts. Man lernt nie aus ... :-D

Meflin 25. Mai 2005 13:18

Re: CriticalSection offen?
 
@brechi: nein, ich meine nicht den "echten" Stack, sondern Stack mehr so als Allgemeinbegriff für Stapel ;)

Zitat:

Zitat von Basilikum
schau Dir mal MSDN-Library durchsuchenTryEnterCriticalSection an

Ok, hört sich interresant an. Nur bis jetzt verwende ich die TCriticalSection Klasse von Delphi. Das wird sich so nicht zusammen verwenden lassen oder?

Dann muss ich wohl oder übel die CriticalSection selber bauen...


alzaimar 25. Mai 2005 14:15

Re: CriticalSection offen?
 
Die TCriticalSection ist nur ein Wrapper für die Critical sections von Windows. Ich meine, Du könntest Dir eine Klasse ableiten und eine Methode 'TryEnter' dazu schreiben. Die besteht doch eigentlich nur aus der einen Zeile 'TryEnterCriticalSection...'

Meflin 25. Mai 2005 14:19

Re: CriticalSection offen?
 
Zitat:

Zitat von alzaimar
Die TCriticalSection ist nur ein Wrapper für die Critical sections von Windows. Ich meine, Du könntest Dir eine Klasse ableiten und eine Methode 'TryEnter' dazu schreiben. Die besteht doch eigentlich nur aus der einen Zeile 'TryEnterCriticalSection...'

naja, die Funktion erwartet ja als Parameter was vom Typ LPCRITICAL_SECTION, und ich frage mich ob meine TCriticalSection diesen Types ist. ansonsten habe ich nicht wirklich erfahrung mit dem umgang und der erweiterung von klassen... :oops:


Olli 25. Mai 2005 14:31

Re: CriticalSection offen?
 
Zitat:

Zitat von Meflin
naja, die Funktion erwartet ja als Parameter was vom Typ LPCRITICAL_SECTION, und ich frage mich ob meine TCriticalSection diesen Types ist. ansonsten habe ich nicht wirklich erfahrung mit dem umgang und der erweiterung von klassen... :oops:

Der Typ ist exakt der gleiche. LP steht nur für Long Pointer. Unter Delphi deklariert man also wahlweise einen Pointertyp (für CritSects existiert der IMO schon) oder deklariert es als "var".

Meflin 25. Mai 2005 14:38

Re: CriticalSection offen?
 
das wäre schön, funzt aber so leider nicht: "[Error] unMain.pas(73): E2033 Types of actual and formal var parameters must be identical"

die TCriticalSection Klasse stellt ein derartiges feature jedenfalls nciht direkt zur verfügung?



Alle Zeitangaben in WEZ +1. Es ist jetzt 07:31 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz