registrieren|
Sonntag, 5. September 2010
Zurck Zurck ..:: Tagebuch ::..   Suchen
 Tagebuch
 Suchen

 Archiv
 Einträge
Sep 04

Erstellt von: Torsten Baumelt
04.09.2008 15:04

Hallo Leute,

ich möchte Euch in diesem Beitrag ein Beispiel für die Verwendung eines System Mutex aus dem .NET Namespace System.Threading zum synchronisieren mehrerer Programme (Prozesse) geben.

Es soll möglich gemacht werden, dass ein Prozess (es geht auch mit mehreren Prozesse) wartet bis ein anderer Prozess fertig ist und der wartende Prozess die Arbeit dann aufnehmen kann. D.h. es kann zu einem Zeitpunkt nur ein Prozess laufen, der Andere oder die Anderen Prozesse müssen warten bzw. werden erst gar nicht gestartet. Dies könnte z.B. sinnvoll sein, wenn mehrere Prozesse eine Ressource verwenden auf die nur ein Prozess gleichzeitig Schreiben kann, oder auf einem Rechner nur eine Instanz eines Prozessen laufen soll.

Hierzu gibt es im .NET Framework ein Klasse mit dem Namen Mutex mit der genau das möglich gemacht wird. Diese Klasse ist Bestandteil des Namespace System.Threading.

Hierzu habe ich eine kleine Windowsanwendung geschrieben, die genau mit dem Mechanismus arbeitet (das Beispielprojekt könnt ihr Euch am Ende des Beitrages für Visual Studio 2005 über einen Verweis runterladen).

Dabei wird in dieser Anwendung beim Drücken einer Schaltfläche versucht, das Recht zu erlangen seine Arbeit als Einziger durchzuführen. Sollte das nicht der Fall sein, muss wird gewartet bis der Prozess der gerade das Recht zu Arbeiten hat, dieses Recht wieder freigibt, weil er mit seiner Arbeit fertig ist. 
Mit der anderen Schaltfläche kann der gerade arbeitende Prozess den Mutex wieder freigeben, d.h. die Arbeit ist erledigt und ein anderer Prozess kann jetzt das Recht bekommen (Erhalt des Mutex) und seine Arbeit starten. 

Nachfolgend der Programmcode mit den beiden Ereignissen (Events) der Schaltflächen: 

Imports System.Threading

Public Class frmMain

    Dim mv_Mutex As Mutex = Nothing

    Private Sub btnHolDirDenMutex_Click _
            (ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles btnHolDirDenMutex.Click

        Dim myKeinAndereBesitzer As Boolean = True
        Dim myExistiertDerMutex As Boolean

        'Es wird die Verbindung zum Mutex hergestellt
        mv_Mutex = New Mutex(myKeinAndereBesitzer, "ES_KANN_NUR_EINEN_GEBEN", myExistiertDerMutex)

        'Es existiert schon ein anderer Besitzer der den Mutex hat (myKeinAndereBesitzer)  
        'oder ein Mutex im System mit dem gleichen Namen (myExistiertDerMutex)  
        If Not (myKeinAndereBesitzer And myExistiertDerMutex) Then

            lblOutput.Text = "O.K. muss warten!"
            Me.Refresh()

            'Warten bis der Mutex freigeben wird
            mv_Mutex.WaitOne()

        End If

        btnHolDirDenMutex.Enabled = False
        btnHierHastDuDenMutex.Enabled = True
        lblOutput.Text = "Habe mir den Mutex gekrallt!"

        'Jetzt kann meine Arbeit durchgeführt, und alle Anderen müssen warten
        ' ....

    End Sub

    Private Sub btnHierHastDuDenMutex_Click _
            (ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles btnHierHastDuDenMutex.Click

        btnHierHastDuDenMutex.Enabled = False
        btnHolDirDenMutex.Enabled = True

        'Der Mutex wird freigeben
        mv_Mutex.ReleaseMutex()
        lblOutput.Text = "Habe den Mutex freigeben!"

    End Sub

End Class

Bemerkung: 
Der Mechanismus funktioniert auch mit Threads. D.h. in verschiedenen Prozessräumen (Prozess zu Prozess) als auch im gleichen Prozessraum (Threading)

Das VB.NET Projekt könnt ihr Euch über den nachfolgenden Verweis runterladen, um den Sourcecode einzusehen. Um es einfach bei Euch auf dem Rechner auszuprobieren startet ihr einfach die  "Es_Kann_Nur_Einen_Geben.exe" zweimal. Die Oberfläche müsste selbsterklärend sein:
Es_kann_Nur_Einen_Geben.zip ...

Falls ihr noch mehr Informationen zum Thema Mutex mit .NET haben wollt, hier der der direkte Link zur MSDN von Microsoft:
http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx
Hier ist auch neben der Erklärung Seitens Mircosoft auch Beispielcode zu finden, wo der Mutex bei Threads zur Synchronisation verwendet wird.

O.K. so viel erst einmal, bei Fragen sendet bitte eine E-Mail an mich:
webmaster@lokato24.de

Bis Denne Totti ( Torsten Baumelt )

Copyright ©2008 Torsten Baumelt

Tags:

Derzeit 3 Kommentare

AW: Programme mit System Mutex aus dem .NET Framework System.Threading synchronisieren

Habe gestern genau nach dem Thema gesucht und habe deinen Beitrag gefunden. Kleines Beispiel was ich gleich ausprobieren konnte. Der Link zu Microsoft gibt Detailinformationen. Viele Grüße Frank

Von Frank am   05.09.2008 17:54

AW: Programme mit System Mutex aus dem .NET Framework System.Threading synchronisieren

Ich finde den Artikel auch gut. Gruß

Von Franz67 am   13.10.2008 10:19

AW: Programme mit System Mutex aus dem .NET Framework System.Threading synchronisieren

Habe gegooglet und diesen Beitrag gefunden. Danke für das Beispiel Projekt ...

Von Paradiso am   13.10.2008 10:23

Ihr Name:
Überschrift:
Kommentar:
Sicherheitscode
Geben Sie die angegebenen Zeichen darunter ein.
Kommentar hinzufügen    abbrechen  
Copyright 2007-2008 by LoKaTo24   Nutzungsbedingungen  Datenschutzerklärung