Semaphore

4D - Documentation   Français   English   German   Spanish   Japanese   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next

Version 11 (Geändert)


Semaphore (Semaphore{; ZähleTick}) Boolean

ParameterTypBeschreibung
SemaphoreStringZu testende und zu setzende Semaphore
ZähleTickGanzzahlMax. Wartezeit
FunktionsergebnisBooleanSemaphore wurde erfolgreich gesetzt (FALSE)
oder Semaphore ist bereits gesetzt (TRUE)

Beschreibung

Eine Semaphore ist ein Flag, das auf Arbeitsstationen oder in Prozessen auf einer Arbeitsstation bekannt ist. Eine Semaphore ist entweder vorhanden oder nicht vorhanden. Die Methoden, die ein Benutzer einsetzt, können testen, ob eine Semaphore vorhanden ist. Methoden können durch Erstellen und Testen von Semaphoren mit den Arbeitsstationen kommunizieren.

Die Funktion Semaphore gibt TRUE zurück, wenn Semaphore vorhanden ist. Ist der Parameter Semaphore nicht vorhanden, setzt 4D die Semaphore und gibt FALSE zurück. Gibt er FALSE zurück, heißt das einerseits, dass die Semaphore nicht vorhanden war, andererseits aber auch, dass die Semaphore für den Prozess gesetzt wurde, der sie aufgerufen hat.

Semaphore gibt FALSE zurück, wenn keine Semaphore gesetzt wurde bzw. wenn die Semaphore bereits im selben Prozess existiert, in dem der Aufruf erfolgt. Der Name für eine Semaphore ist auf 255 Zeichen begrenzt, inkl. der vorangestellten Zeichen <>, $. Längere Namen werden abgeschnitten. Es wird zwischen Groß- und Kleinbuchstaben unterschieden. Das Programm unterscheidet also zwischen MeineSemaphore und meinesemaphore.

Mit dem optionalen Parameter ZähleTick geben Sie eine Wartezeit in Ticks an, wenn Semaphore bereits gesetzt wurde. In diesem Fall wartet die Funktion entweder, bis die Semaphore freigegeben oder die Wartezeit abgelaufen ist und gibt erst dann True zurück.

Es gibt zwei Arten von Semaphoren:

- Lokale Semaphoren werden nur von den Prozessen auf derselben Arbeitsstation und nur von dieser erkannt. Sie werden mit einem vorangestellten Dollarzeichen gekennzeichnet, z.B. $MeineSemaphore. Mit lokalen Semaphoren steuern Sie Operationen zwischen Prozessen, die auf einer Arbeitsstation ausgeführt werden. Eine lokale Semaphore kann z.B. den Zugriff auf ein Interprozess-Array steuern, das sich alle Prozesse einer Arbeitsstation oder im 4D Einzelplatzbetrieb teilen.

- Globale Semaphoren sind für alle Benutzer und für alle Prozesse zugänglich. Mit globalen Semaphoren verwalten Sie Operationen zwischen Benutzern einer Datenbank im Mehrplatzbetrieb.

Globale und lokale Semaphoren funktionieren nach derselben Logik. Der Unterschied liegt in ihrer Reichweite. Auf 4D Server werden globale Semaphoren zwischen allen Prozessen auf allen Clients geteilt, lokale Semaphoren dagegen nur zwischen Prozessen auf der Arbeitsstation, wo sie erzeugt wurden.

In 4D haben globale und lokale Semaphoren dieselbe Reichweite, da es nur einen Benutzer gibt. Wird die Datenbank jedoch in beiden Setups verwenden, stellen Sie sicher, dass, - je nachdem, was ausgeführt werden soll - globale oder lokale Semaphoren verwendet werden.

Verwenden Sie keine Semaphoren, um den Zugriff auf Datensätze zu verwalten. Das erledigen 4D und 4D Server automatisch. Setzen Sie Semaphoren ein, damit nicht mehrere Benutzer gleichzeitig dieselbe Operation ausführen können.

Beispiele

1. In diesem Beispiel wollen Sie verhindern, dass zwei Benutzer gleichzeitig die Preise in einer Produktetabelle global aktualisieren können. Schreiben Sie dazu folgende Methode:

   If (Semaphore("UpdatePrices")) ` Versuche die Semaphore zu erstellen 
      ALERT("Ein anderer Benutzer aktualisiert bereits die Preise global. 
                                    Versuchen Sie es später wieder.") 
   Else 
      DoUpdatePrices ` Aktualisiere alle Preise
      CLEAR SEMAPHORE("UpdatePrices")) ` Lösche die Semaphore 
   End if

2. Folgendes Beispiel verwendet eine lokale Semaphore. Sie wollen in einer Datenbank mit mehreren Prozessen eine To Do Liste aufrechterhalten. Sie soll in einem Interprozess-Array und nicht in einer Tabelle verwaltet werden. Über eine Semaphore verhindern Sie den gleichzeitigen Zugriff. Für diesen Fall benötigen Sie nur eine lokale Semaphore, da nur ein Arbeitsplatz mit der To-Do Liste arbeitet.

Das Interprozess-Array wird in der Startup Methode initialisiert:

   ARRAY TEXT(<>ToDoList;0) ` Die To Do Liste ist zuerst leer

Mit dieser Methode fügen Sie Einträge in die To Do Liste ein:

      ` Projektmethode ADD TO DO LIST 
      ` ADD TO DO LIST ( Text )
      ` ADD TO DO LIST ( Eintrag in To-do Liste )
   C_TEXT($1) 
   If(Not (Semaphore("$AccessToDoList";300)))  
               ` Warte 5 Sekunden, wenn Semaphore bereits existiert
      $vlElem:=Size of array(<>ToDoList)+1 
      INSERT IN ARRAY(<>ToDoList;$vlElem)
      <>ToDoList{$vlElem}:=$1 
      CLEAR SEMAPHORE("$AccessToDoList") ` Lösche die Semaphore
   End if

Obige Methode können Sie von jedem Prozess aus aufrufen.

Referenz

CLEAR SEMAPHORE, Test semaphore.


4D - Documentation   Français   English   German   Spanish   Japanese   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next