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 )
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
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
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
AW: Programme mit System Mutex aus dem .NET Framework System.Threading synchronisieren Ich finde den Artikel auch gut. Gruß
Ich finde den Artikel auch gut. Gruß
AW: Programme mit System Mutex aus dem .NET Framework System.Threading synchronisieren Habe gegooglet und diesen Beitrag gefunden. Danke für das Beispiel Projekt ...
Habe gegooglet und diesen Beitrag gefunden. Danke für das Beispiel Projekt ...