![]() |
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:
Nun ist es mir beim Debuggen allerdings passiert, dass zwischen Zeile 1 und 3 ein anderes Objekt die Methode ausgeführt hat.
if not Methodeaktiv then
Begin Methodeaktiv:=true; ... End; Meine Frage ist, ob man mit Delphi5 eine Methode oder mehrere Anweisungen atomar ausführen lassen kann? |
Re: atomare Ausführung
Der Klasse oder eines Objektes?
Semaphore, Monitor, ... |
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 ... |
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. |
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. |
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...
|
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 ![]() ![]() |
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.
|
Re: atomare Ausführung
Zitat:
|
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 14:51 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