Semaphore

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

Version 6.5 (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

Die Funktion Semaphore prüft, ob eine Semaphore mit der Bezeichnung Semaphorenname vorhanden ist. Ist die Semaphore bereits gesetzt, gibt sie TRUE zurück, ist sie nicht vorhanden, setzt 4th Dimension die Semaphore und gibt FALSE zurück.

Mit dem optionalen Parameter ZähleTick geben Sie eine Wartezeit an, wenn Semaphorenname 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.

Wollen Sie nicht, daß zwei Prozesse gleichzeitig bestimmte Operationen durchführen, gehen Sie folgendermaßen vor:

Setzen Sie eine Semaphore in dem Prozeß, der zuerst ausgeführt wird. Die Semaphore wird auf Wahr gesetzt.

Im zweiten Prozeß wird versucht, die Semaphore nochmals zu setzen. Beim Ausführen des zweiten Prozesses wird geprüft, ob die Semaphore vorhanden ist.

Es gibt nun zwei Möglichkeiten:

- Die Semaphore gibt es. Sie halten den Prozeß an und warten, bis der erste Prozeß die Semaphore löscht.

- Die Semaphore gibt es nicht. Sie setzen sie und führen den Prozeß weiter aus. Danach löschen Sie die Semaphore wieder, damit andere Prozesse weiterarbeiten können.

Der Name für eine Semaphore ist begrenzt auf 30 Zeichen, inkl. der vorangestellten Zeichen <>, $. Längere Namen werden abgeschnitten. Gross- und Kleinbuchstaben werden unterschieden. Das Programm unterscheidet also zwischen MeineSemaphore und meinesemaphore.

4D Server-Anwender

4D Server kennt zwei Typen von Semaphoren:

Lokale Semaphoren werden nur von den Prozessen der einen Arbeitsstation erkannt. Setzen Sie zur Unterscheidung das Dollarzeichen vor ihren Namen: $MeineSemaphore.

Globale Semaphoren werden von allen Prozessen der angeschlossenen Arbeitsstationen erkannt.

Verwenden Sie keine Semaphoren, um den Zugriff auf Datensätze zu verwalten. Das erledigen 4th Dimension 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, daß 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 Interprozeß-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 Interprozeß-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 ELEMENT(<>ToDoList;$vlElem)
      <>ToDoList{$vlElem}:=$1 
      CLEAR SEMAPHORE("$AccessToDoList") ` Lösche die Semaphore
   End if

Obige Methode können Sie von jedem Prozeß aus aufrufen.

Referenz

CLEAR SEMAPHORE, Test semaphore.


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