Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi atomare Ausführung (https://www.delphipraxis.net/124041-atomare-ausfuehrung.html)

Bomberbb 13. Nov 2008 14:22


atomare Ausführung
 
Hallo,

ich hab mich jetzt näher mit oop befasst und habe ein Problem. Bei einer von mir erstellten Klasse darf eine Methode dieser Klasse zum gleichen Zeitpunkt immer nur einmal ausgeführt werden.
Ich hab das jetzt gemacht mit der Abfrage
Delphi-Quellcode:
if not Methodeaktiv then
Begin
  Methodeaktiv:=true;
  ...
End;
Nun ist es mir beim Debuggen allerdings passiert, dass zwischen Zeile 1 und 3 ein anderes Objekt die Methode ausgeführt hat.

Meine Frage ist, ob man mit Delphi5 eine Methode oder mehrere Anweisungen atomar ausführen lassen kann?

mkinzler 13. Nov 2008 14:25

Re: atomare Ausführung
 
Der Klasse oder eines Objektes?
Semaphore, Monitor, ...

jfheins 13. Nov 2008 14:26

Re: atomare Ausführung
 
Du kannst eine Critical Section benutzen, die sollte das wirksam verhindern ;)
(evtl. ein bisschen Overkill)

Ich nehme mal an, du verwendest bereits mehrere Threads? Wenn nicht, dürfte das Problem ja eigentlich nicht auftreten ...

Bomberbb 13. Nov 2008 14:35

Re: atomare Ausführung
 
@mkinzler
Der Klasse!
Monitore habe ich unter Delphi 5 nicht gefunden. Und zum Arbeiten mit Semaphoren brauche ich auch unteilbare/atmoare Blöcke...
@jfheins
Jein, ich habe mehrere Zeichenflächen, die Objekte des gleichen Typs sind. Dort wird das Zeichnen nacheinander angestoßen und wegen der Parallelität der Objekte wohl 'quasiparallel' ausgeführt.

jfheins 13. Nov 2008 14:40

Re: atomare Ausführung
 
Ok, dann nimm eine Klassenvariable (Gibts doch bestimmt in aktuelleren Delphi Versionen?) und benutze die Critical Section.
Diese sorgt dann dafür, dass die Funktion nicht in mehreren Objekten gleichzeitig ausgeführt wird.

Es muss aber eben ne Klassenvariable sein, damit nicht jedes Objekt eine eigene CriticalSection bekommt.

Bomberbb 13. Nov 2008 14:43

Re: atomare Ausführung
 
Nun in Delphi 5 gibts keine Klassenvariablen, aber ich werde mich mal zu Critical Section schlau machen, kannte ich bis dato noch nicht...

Fridolin Walther 13. Nov 2008 14:43

Re: atomare Ausführung
 
Nur ein kleiner Hinweis:
Atomar bedeutet etwas anderes als das was Du meinst. Atomar bedeutet, das etwas entweder komplett durchgeführt wird (Lese oder Schreiboperation z.B.) oder gar nicht. Das es also nur zwei Ergebnisse gibt und man nicht in irgendeinem Zwischenstadium landet, das etwas nur halb geschrieben/gelesen ist.

Ansonsten sind Critical Sections die wahrscheinlich einfachste Lösung für Dein Problem. Siehe einfach mal MSDN-Library durchsuchenEnterCriticalSection oder aber einfach mal im Board nach Hier im Forum suchenCritical Section suchen.

Gausi 13. Nov 2008 14:46

Re: atomare Ausführung
 
Aber Critical Sections bringen nichts, wenn man mit nur einem Thread arbeitet. Denn ein Thread kann beliebig oft in eine CS eintreten - nur ein anderer Thread ist dann dafür gesperrt.

Fridolin Walther 13. Nov 2008 14:51

Re: atomare Ausführung
 
Zitat:

Zitat von Gausi
Aber Critical Sections bringen nichts, wenn man mit nur einem Thread arbeitet. Denn ein Thread kann beliebig oft in eine CS eintreten - nur ein anderer Thread ist dann dafür gesperrt.

Nunja, ist die Frage ob er verhindern will ob eine Methode gleichzeitig mehrfach ausgeführt wird (Multi Threading) oder ob er Rekursion verhindern will (das also seine Methode etwas macht, was evtl. dafür sorgt, das seine Methode direkt oder indirekt nochmal aufgerufen wird). Gegen Rekursion hilft eine Critical Section natürlich nicht. Und sollte er Fiber statt Threads verwenden, sind Critical Sections auch nutzlos ;).

Bomberbb 13. Nov 2008 15:08

Re: atomare Ausführung
 
Also, für meinen Fall scheint 'Critical Sections' zu funktionieren... Ich denke, auch wenn ich nicht explizit mehrere Threads angestoßen habe, existieren doch mehrere Objekte gleichzeitig und können Zeitgleich agieren und dass muss doch zumindest ähnlich wie MultiThreading behandelt werden...? oder liege ich da jetzt total falsch???


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:44 Uhr.
Seite 1 von 2  1 2      

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