SOG-Helpcenter Logo SOG Business - Software

Verwendung von SOG Semaphoren


 

Beschreibung


SOG Semaphoren können dazu verwendet werden, die Eindeutigkeit von Prozessen Netzwerkweit sicherzustellen.

Durch ihre speziellen Eigenschaften können Semaphoren auch Eindeutigkeiten auf Ebenes eines Rechners, eines Projekte, einer Firma oder beliebiger Kombinationen daraus herstellen.

Semaphoren können außerdem für den Austausch von Daten über Prozessgrenzen hinweg verwendet werden.

Für die Verwendung von Semaphoren ist die Einrichtung eines Semaphorenservers und die Definition der Variablen "hhpsinfoServer" erforderlich.

Erzeugung von Semaphoren


Für die Erzeugung von Semaphoren ist ein SOGPsInfo-Objekt erforderlich. Das SOGPsInfo-Objekt behandelt die Verbindung zum Semaphorenserver. Achtung: Da das SOGPsInfo-Objekt einen eigenen Thread erzeugt, muss dieses vor dem Beenden des Programms mittels "Close()" oder "Dispose()" verworfen werden!


protected SOGPsInfo psi = null;
protected SOGPsInfoSema sema = null;

private void Init()
{
    psi = new SOGPsInfo( null );
}

Nun kann eine Semaphore definiert werden.

    sema = psi.GetSema( "EindeutigerName" );
    sema.Lock();

Benennung von Semaphoren


Als "EindeutigenNamen" sollten Sie selbst einen Namen wählen, der Ihren Anforderungen entspricht.

Beginnt der Name mit einem "#"-Zeichen, wird eine Client-Lizenz für ein Softwarepaket reserviert. Beispiel: "#vacos".

Beginnt der Name nicht mit einem "." Zeichen, wird eine projektbezogene Semaphore reserviert (${hhproj},Name).

Beginnt der Name mit einem "." Zeichen, wird eine globale Semaphore reserviert (GLOBAL,Name)

Möchten Sie die Eindeutigkeit des Starts eines Programm auf Ebne einer Benutzeranmeldung prüfen, sollten Sie den Namen der Semaphoren um den Rechnernamen und die Terminalserver Session-ID erweitern. Die Anweisungen

    string computername = v.Env.GetEnv( "COMPUTERNAME" );
    int sessionid = SOGLuebeck.SOGWin32Bas.TSSupport.GetSessionId();
    string semaname = string.Format( "AppName/{0}/{1}", computername, sessionid );

erstellen einen Semaphorennamen, der für die Applikation pro Benutzeranmeldung, pro Projekt eindeutig ist.

Empfangen von Nachrichten über eine Semaphore
Semaphoren können genutzt werden, um einfache Nachrichten zu empfangen.

    string msg = psi.ReceiveMessage( sema );

Liegt keine Nachricht vor, liefert die Funktion "null".

Um über das Eintreffen von neuen Nachrichten informiert zu werden, können Sie einen EventHandler registrieren:

    sema.OnDataAvailable += new EventHandler(sema_OnDataAvailable);
    private void sema_OnDataAvailable(object sender, EventArgs e)
    {
        ....
    }

Achtung: Die Signalisierung erfolgt über einen eigenen Thread. Sie sollten also ggf. den Aufruf über "Invoke" oder "BeginInvoke" an Ihr Fenster weiterleiten.

    private void sema_OnDataAvailable(object sender, EventArgs e)
    {
        if ( this.InvokeRequired )
            BeginInvoke( new System.EventHandler( OnDataAvailable ), new object[] { sender, e } );
        else
            OnDataAvailable( sender, e );
    }

    private void OnDataAvailable(object sender, EventArgs e)
    {
        dataAvailable.Text = "DATA!";
    }

Senden von Nachrichten an einen Semaphorenempfänger
Auch für den Versand von Nachrichten an einen Semaphorenempfänager ist ein SOGPsInfo-Objekt erforderlich.

    protected SOGPsInfo psi = null;

    private void Init()
    {
        psi = new SOGPsInfo( null );
    }

Nun kann jedoch direkt eine Nachricht an einen Empfänger versand werden:

        psi2.SendMessage( "EindeutigerName", Text );

Verwenden Sie hierzu den gleichen eindeutigen Namen, wie bei der Reservierung der Semaphoren.