AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prozedur gegen sich selbst absichern

Ein Thema von DelphiManiac · begonnen am 27. Mär 2009 · letzter Beitrag vom 27. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#1

Prozedur gegen sich selbst absichern

  Alt 27. Mär 2009, 12:45
Hallo,

ich habe folgendes Problem und hoffe ihr könnt mir da helfen:


Ich habe eine Prozedur:
Delphi-Quellcode:
procedure TuWas;
begin
  // Prozedur tut was und hat einen exklusiven Zugriff auf eine Ressource
  // zwischendurch ruft sie Application.ProcessMessages auf
end;
Jetzt wird diese Methode von mehreren Seiten aufgerufen (Button.Clicks, oder Timmereignisse etc).
Da es schwierig ist diese zu synchronisieren würde ich gerne eine Möglichkeit schaffen, dass die Prozedur nur exklusiv aufgerufen wird.

Jetzt kann folgendes passieren:

- Button.Click
-> TuWas wird aufgerufen (das dauert u.Um. 100 ms und zwischendurch wird Application.Processmessages aufgerufen)
->Timer Ereignis schlägt zu und ruft auch TuWas auf.

Jetzt ist kein konsistenter Zustand mehr gegeben.

Ich wollte euch fragen welche Form von Sperrobjekten man da verwenden kann schließlich ist ja alles im einem Thread und einem Prozess?


Vielen Dank

MfG
DelphiManiac
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Prozedur gegen sich selbst absichern

  Alt 27. Mär 2009, 12:49
Das einfachste ist ein Flag (IchBinInTuWas: Boolean) das in der Unit definiert wird und am Anfang geprüft, anschließend gesetzt und am Ende zurück gesetzt wird.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Prozedur gegen sich selbst absichern

  Alt 27. Mär 2009, 12:49
Du kannst über eine globale Variable (welche im Implementationsteils plaziert werden sollte) absichern das die Funktion nicht mehrfach aufgerufen wird.
Was mir bei deiner Beschreibung fehlt: Was soll passieren die Funktion bereits aktitv ist?
Und anstelle von ProcessMessages wäre hier vielleicht ein Thread sinnvoller? Dann sollte der Zugriff über CriticalSections erfolgen.

[Edit]Du schreibst
Zitat:
Jetzt wird diese Methode...
Wenn es sich wirklich um eine Methode handelt (was hier wirklich sinnvoll wäre) dann gehört die Variable natürlich in den private-Bereich. Wenn es sich jedoch um eine Ressource handelt auf die auch nicht von mehreren Instanzen zugegriffen werden soll dann gehört sie wieder global so das die Methode (egal von welcher Instanz) nur einmal zur gleichen zeit aufgerufen werden kann. In dem Fall bietet es sich auch an den Zugriff auf die Ressource über eine eigene Komponente zu realisieren und über diese das ganze abzusichern.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#4

Re: Prozedur gegen sich selbst absichern

  Alt 27. Mär 2009, 13:07
Hallo,

also einen Thread würde ich an der Stelle recht ungern einpflegen, weiß, dass das im Prinzip die sauberste Lösung wäre, aber das bringt noch eine Reihe anderer Probleme mit sich, und da es eine Programmerweiterung sein soll, sind mir hier glaube ich die Hände gebunden...

Also wenn die Methode noch aktiv ist sollen "die" anderen warten, also müsste das im Prinzip in eine Queue gehen die nach FIFO die Aufrufe macht, wenn die Methode nicht mehr besetzt ist, so macht es doch auch die Windows Queue, aber da kann ja der Methoden aufruf durch dass Appl.Processmessages dazwischen kommen.

Gruß
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Prozedur gegen sich selbst absichern

  Alt 27. Mär 2009, 13:17
Das warten gestaltet sich sehr schwierig/unmöglich? wenn du eine Threads arbeitest. Denn wenn Du ProcessMessages aufrufst und dann im Timerevent wartest (weil die Funktion bereits belegt ist) dann kehrt ProcessMessages auch nicht zurück und somit wird die Funktion nie fertig. Warten ist also nur richtig möglich wenn es sich um mehrere Threads handelt.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#6

Re: Prozedur gegen sich selbst absichern

  Alt 27. Mär 2009, 13:37
Ok, angenommen ich würde dieses eine Prozedur in einen Thread auslagern,

wie sollte ich dann die Absicherung machen, über Critical Sections?

Gruß
DM
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#7

Re: Prozedur gegen sich selbst absichern

  Alt 27. Mär 2009, 13:41
Zitat von DelphiManiac:
...
Also wenn die Methode noch aktiv ist sollen "die" anderen warten, also müsste das im Prinzip in eine Queue gehen die nach FIFO die Aufrufe macht, wenn die Methode nicht mehr besetzt ist, so macht es doch auch die Windows Queue, aber da kann ja der Methoden aufruf durch dass Appl.Processmessages dazwischen kommen.

Gruß
Hallo,

du siehst das schon nebelhaft richtig, wenn Tuwas zwar exklusiv ist, aber nach Aufruf immer abgearbeitet werden muss, dann muss man wohl die Programmstruktur nicht unerheblich ändern und für Tuwas eine Warteschlange einrichten - die Aufrufer platzieren dort also ihren Wunsch nach Tuwas und die Parameter dazu. Das Problem setzt sich aber fort: können die Aufrufer dann weitermachen oder müssen sie warten, bis ihr Tuwas fertig ist? Das erhöht das Deadlock-Potential gewaltig und setzt sorgfältige Planung voraus.

Da Windows (inzwischen) preemptive Multitasking verwendet, kann man auch mit einer einfachen boolschen variable in Schwierigkeiten kommen, daher solltest du dich mit den Möglichkeiten des BS beschäftigen wie Mutexe, Semaphoren, Critical Sections usw. Ist komplex, aber das liegt halt am Problem.

Gruss Reinhard
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Prozedur gegen sich selbst absichern

  Alt 27. Mär 2009, 13:41
Zitat von DelphiManiac:
Ich wollte euch fragen welche Form von Sperrobjekten man da verwenden kann
Aus der Indy Library:

TIdThreadSafeBoolean

(in IdThreadSafe.pas)

Cheers,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#9

Re: Prozedur gegen sich selbst absichern

  Alt 27. Mär 2009, 13:42
Zitat von DelphiManiac:
Ok, angenommen ich würde dieses eine Prozedur in einen Thread auslagern,

wie sollte ich dann die Absicherung machen, über Critical Sections?

Gruß
DM
Ja zum Beispiel

Wenn du sie in einen Thread auslagerst, kannst du dir das Application.Provessmessages sparen, da die Hauptanwendung ja sowiso weiterläuft.

Dann musst du dir ein CriticalSection-Objekt erstellen und am anfang der Prozedur da rein gehen (weis nicht, wie die Methode genau heißt) Falls die Critical Section belegt ist, wird entsprechend gewartet.

Am Ende musst du sie verlassen, was es dann den wartenden ermöglicht, ihrerseits einzutreten.
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#10

Re: Prozedur gegen sich selbst absichern

  Alt 27. Mär 2009, 13:44
Zitat von jfheins:
... am anfang der Prozedur da rein gehen (weis nicht, wie die Methode genau heißt) ... Am Ende musst du sie verlassen
TCriticalSection.Enter und .Leave
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 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