OVH Cloud OVH Cloud

mutex

6 réponses
Avatar
Stéphane L.
Bonjour,

Suite à 1 post existant pour controler si 1 progamme tourne déjà, la
solution du mutex a été apportée.
J'ai essayé ceci (Chargement_en_cours est le formulaire de démarrage de
l'application) :

Public Class Chargement_en_cours

Inherits System.Windows.Forms.Form

Private Sub Chargement_en_cours_Load(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles MyBase.Load

'ok = vrai lors du 1er lancement de l'application

'ok = faux si l'application est déjà lancée

Dim ok As Boolean

'crée un mutex unique nommé MonMutexUnique

Dim mut As New System.Threading.Mutex(True, "MonMutexUnique", ok)

If Not ok Then

'L'application a déjà été lancée, fin du programme de la 2e application

End

End If

End Sub

End Class

J'ai fait 1 test en mode débug, en mettant 1 point d'arrêt sur la ligne :
If Not ok Then

L'espion me donne bien la valeur Vrai.
Je remonte alors la ligne d'exécution d'un cran en la pointant sur :
Dim mut As New System.Threading.Mutex(True, "MonMutexUnique", ok)

Et je fait F11 (mode Pas à pas) 1 fois.

L'espion me donne bien maintenant la valeur Faux car mon mutex existe déjà.

Cela semble fonctionner normalement en mode débug, j'essaye maintenant de
compiler.

Après avoir compilé en mode release, je ferme VB .Net pour tester.
Je lance mon programme WindowsApplication1.exe, mon formulaire apparaît.
Je relance de nouveau WindowsApplication1.exe, mon formulaire réapparaît une
deuxième fois au lieu de se fermer.
J'ai également essayé :
Dim mut As New System.Threading.Mutex(False, "MonMutexUnique", ok)

Mais le résultat reste le même, cela fonctionne en debug dans VB, mais ne
fonctionne pas en release en exe.


Savez-vous où se trouve mon problème ?

Merci d'avance pour votre aide.

--
Cordialement,

Stéphane L

6 réponses

Avatar
Laurent B
Salut,

Autre possibilité que Mutex :

If UBound(Diagnostics.Process.GetProcessesByName
("Nom_EXE_à_Tester")) > 0 Then
End
End If

A inserer dans l'évenement Load

A ++


//////////////////////////////////////////////
-----Message d'origine-----
Bonjour,

Suite à 1 post existant pour controler si 1 progamme


tourne déjà, la
solution du mutex a été apportée.
J'ai essayé ceci (Chargement_en_cours est le formulaire


de démarrage de
l'application) :

Public Class Chargement_en_cours

Inherits System.Windows.Forms.Form

Private Sub Chargement_en_cours_Load(ByVal sender As


System.Object, ByVal e
As System.EventArgs) Handles MyBase.Load

'ok = vrai lors du 1er lancement de l'application

'ok = faux si l'application est déjà lancée

Dim ok As Boolean

'crée un mutex unique nommé MonMutexUnique

Dim mut As New System.Threading.Mutex


(True, "MonMutexUnique", ok)

If Not ok Then

'L'application a déjà été lancée, fin du programme de la


2e application

End

End If

End Sub

End Class

J'ai fait 1 test en mode débug, en mettant 1 point


d'arrêt sur la ligne :
If Not ok Then

L'espion me donne bien la valeur Vrai.
Je remonte alors la ligne d'exécution d'un cran en la


pointant sur :
Dim mut As New System.Threading.Mutex


(True, "MonMutexUnique", ok)

Et je fait F11 (mode Pas à pas) 1 fois.

L'espion me donne bien maintenant la valeur Faux car mon


mutex existe déjà.

Cela semble fonctionner normalement en mode débug,


j'essaye maintenant de
compiler.

Après avoir compilé en mode release, je ferme VB .Net


pour tester.
Je lance mon programme WindowsApplication1.exe, mon


formulaire apparaît.
Je relance de nouveau WindowsApplication1.exe, mon


formulaire réapparaît une
deuxième fois au lieu de se fermer.
J'ai également essayé :
Dim mut As New System.Threading.Mutex


(False, "MonMutexUnique", ok)

Mais le résultat reste le même, cela fonctionne en debug


dans VB, mais ne
fonctionne pas en release en exe.


Savez-vous où se trouve mon problème ?

Merci d'avance pour votre aide.

--
Cordialement,

Stéphane L


.



Avatar
Bismark Prods
Bonsoir,

"Stéphane L." a écrit dans le message de
news:

Après avoir compilé en mode release, je ferme VB .Net pour tester.
Je lance mon programme WindowsApplication1.exe, mon formulaire apparaît.
Je relance de nouveau WindowsApplication1.exe, mon formulaire réapparaît


une
deuxième fois au lieu de se fermer.



Il me semble que si vous lancez 2 applications WindowsApplication1.exe ...
elles se trouveront dans 2 process différents, le mutex ne peut donc pas
être utile dans ce cas précis. Le mutex a accès au thread qui se trouve dans
le meme pool si j'ai pas trop mal compris l'histoire des threads .. lol

--
Cordialement,

Stéphane L





Bismark
Avatar
Zazar
Bonjour,

Suite à 1 post existant pour controler si 1 progamme tourne déjà, la
solution du mutex a été apportée.



C'est effectivement la meilleure méthode.

(...)
Dim mut As New System.Threading.Mutex(True, "MonMutexUnique", ok)


(...)

Un mutex est un moyen de synchroniser plusieurs tâches effectuées
simultanément. On peut créer des mutex pour la synchronisation entre
processus ou bien entre threads d'un même processus par exemple. La méthode
que vous utilisez correspond au 2ième cas et donc un mutex par processus est
créé. Cependant le cas qui vous intéresse est l'utilisation d'un mutex pour
tous les processus. Je ne sais pas si il existe des classes/méthodes .NET
pour le faire. Si vous n'en trouvez, vous devrez utiliser l'API Win32
CreateMutex :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createmutex.asp.


--
Zazar
Avatar
Stéphane L.
J'ai donc essayé ceci à la place de mon mutex (que j'ai enlevé) dans mon
form de démarrage dans le load

If UBound(Diagnostics.Process.GetProcessesByName("WindowsApplication1.exe"))
0 Then


End
End If

Je compile en mode release
Je lance WindowsApplication1.exe, le processus se lance normalement et la
fenêtre apparaît.
Je relance WindowsApplication1.exe, le processus se relance de nouveau :-/


"Laurent B" a écrit dans le message de
news:207c801c45945$34aee870$
Salut,

Autre possibilité que Mutex :

If UBound(Diagnostics.Process.GetProcessesByName
("Nom_EXE_à_Tester")) > 0 Then
End
End If

A inserer dans l'évenement Load

A ++


//////////////////////////////////////////////
-----Message d'origine-----
Bonjour,

Suite à 1 post existant pour controler si 1 progamme


tourne déjà, la
solution du mutex a été apportée.
J'ai essayé ceci (Chargement_en_cours est le formulaire


de démarrage de
l'application) :

Public Class Chargement_en_cours

Inherits System.Windows.Forms.Form

Private Sub Chargement_en_cours_Load(ByVal sender As


System.Object, ByVal e
As System.EventArgs) Handles MyBase.Load

'ok = vrai lors du 1er lancement de l'application

'ok = faux si l'application est déjà lancée

Dim ok As Boolean

'crée un mutex unique nommé MonMutexUnique

Dim mut As New System.Threading.Mutex


(True, "MonMutexUnique", ok)

If Not ok Then

'L'application a déjà été lancée, fin du programme de la


2e application

End

End If

End Sub

End Class

J'ai fait 1 test en mode débug, en mettant 1 point


d'arrêt sur la ligne :
If Not ok Then

L'espion me donne bien la valeur Vrai.
Je remonte alors la ligne d'exécution d'un cran en la


pointant sur :
Dim mut As New System.Threading.Mutex


(True, "MonMutexUnique", ok)

Et je fait F11 (mode Pas à pas) 1 fois.

L'espion me donne bien maintenant la valeur Faux car mon


mutex existe déjà.

Cela semble fonctionner normalement en mode débug,


j'essaye maintenant de
compiler.

Après avoir compilé en mode release, je ferme VB .Net


pour tester.
Je lance mon programme WindowsApplication1.exe, mon


formulaire apparaît.
Je relance de nouveau WindowsApplication1.exe, mon


formulaire réapparaît une
deuxième fois au lieu de se fermer.
J'ai également essayé :
Dim mut As New System.Threading.Mutex


(False, "MonMutexUnique", ok)

Mais le résultat reste le même, cela fonctionne en debug


dans VB, mais ne
fonctionne pas en release en exe.


Savez-vous où se trouve mon problème ?

Merci d'avance pour votre aide.

--
Cordialement,

Stéphane L


.



Avatar
Stéphane L.
Autant pour moi, j'ai fait 1 gaffe...

Il ne faut pas marquer l'extension

Ca marche parfaitement :)

Reste plus qu'à vérifier que le nom du fichier exe que je lance n'ait pas
été changé, sinon, ca contourne le shmilblick

Merci
Stéphane

"Stéphane L." a écrit dans le message de
news:%
J'ai donc essayé ceci à la place de mon mutex (que j'ai enlevé) dans mon
form de démarrage dans le load

If


UBound(Diagnostics.Process.GetProcessesByName("WindowsApplication1.exe"))
> 0 Then
End
End If

Je compile en mode release
Je lance WindowsApplication1.exe, le processus se lance normalement et la
fenêtre apparaît.
Je relance WindowsApplication1.exe, le processus se relance de nouveau :-/


"Laurent B" a écrit dans le message


de
news:207c801c45945$34aee870$
Salut,

Autre possibilité que Mutex :

If UBound(Diagnostics.Process.GetProcessesByName
("Nom_EXE_à_Tester")) > 0 Then
End
End If

A inserer dans l'évenement Load

A ++


//////////////////////////////////////////////
>-----Message d'origine-----
>Bonjour,
>
>Suite à 1 post existant pour controler si 1 progamme
tourne déjà, la
>solution du mutex a été apportée.
>J'ai essayé ceci (Chargement_en_cours est le formulaire
de démarrage de
>l'application) :
>
>Public Class Chargement_en_cours
>
>Inherits System.Windows.Forms.Form
>
>Private Sub Chargement_en_cours_Load(ByVal sender As
System.Object, ByVal e
>As System.EventArgs) Handles MyBase.Load
>
>'ok = vrai lors du 1er lancement de l'application
>
>'ok = faux si l'application est déjà lancée
>
>Dim ok As Boolean
>
>'crée un mutex unique nommé MonMutexUnique
>
>Dim mut As New System.Threading.Mutex
(True, "MonMutexUnique", ok)
>
>If Not ok Then
>
>'L'application a déjà été lancée, fin du programme de la
2e application
>
>End
>
>End If
>
>End Sub
>
>End Class
>
>J'ai fait 1 test en mode débug, en mettant 1 point
d'arrêt sur la ligne :
>If Not ok Then
>
>L'espion me donne bien la valeur Vrai.
>Je remonte alors la ligne d'exécution d'un cran en la
pointant sur :
>Dim mut As New System.Threading.Mutex
(True, "MonMutexUnique", ok)
>
>Et je fait F11 (mode Pas à pas) 1 fois.
>
>L'espion me donne bien maintenant la valeur Faux car mon
mutex existe déjà.
>
>Cela semble fonctionner normalement en mode débug,
j'essaye maintenant de
>compiler.
>
>Après avoir compilé en mode release, je ferme VB .Net
pour tester.
>Je lance mon programme WindowsApplication1.exe, mon
formulaire apparaît.
>Je relance de nouveau WindowsApplication1.exe, mon
formulaire réapparaît une
>deuxième fois au lieu de se fermer.
>J'ai également essayé :
>Dim mut As New System.Threading.Mutex
(False, "MonMutexUnique", ok)
>
>Mais le résultat reste le même, cela fonctionne en debug
dans VB, mais ne
>fonctionne pas en release en exe.
>
>
>Savez-vous où se trouve mon problème ?
>
>Merci d'avance pour votre aide.
>
>--
>Cordialement,
>
>Stéphane L
>
>
>.
>




Avatar
Patrick Philippot
Bismark Prods wrote:
Il me semble que si vous lancez 2 applications
WindowsApplication1.exe ... elles se trouveront dans 2 process
différents, le mutex ne peut donc pas être utile dans ce cas précis.
Le mutex a accès au thread qui se trouve dans le meme pool si j'ai
pas trop mal compris l'histoire des threads .. lol



Un mutex est global au système. Il peut donc être vu de plusieurs
processus différents. C'est justement l'intérêt de cet objet par rapport
à une section critique, par exemple.

En fait, je devrais dire un mutex est *par défaut* global à la
*session*. Ce qui a une importance fondamentale sous XP quand on utilise
le Fast User Switching (plusieurs sessions utilisateur concurrentes).
Dans ce cas, pour que le mutex soit vu globalement de toutes les
sessions, il faut que son nom soit préfixé avec Global. C'est
documenté.

--
Patrick Philippot - Microsoft MVP [.Net]
MainSoft Consulting Services
www.mainsoft.fr