Version 11 (Geändert)
Semaphore (Semaphore{; ZähleTick}) Boolean
Parameter | Typ | Beschreibung | |
Semaphore | String | Zu testende und zu setzende Semaphore | |
ZähleTick | Ganzzahl | Max. Wartezeit | |
Funktionsergebnis | Boolean | Semaphore 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.