Page 1 sur 1

[R] _Singleton ()

Posté : ven. 28 déc. 2018 10:06
par DimVar
Bonjour,

Pourrirez-vous éclairer ma lanterne sur cette fonction ?
La doc nous dit : String to identify the occurrence of the script
Mais encore ? Est ce le nom du script ? Si oui, une fois compilé et que je change le nom de l'exe ?

Merci.

Re: [..] _Singleton ()

Posté : ven. 28 déc. 2018 10:26
par mikell
Essaye StringTrimRight(@ScriptName, 4)

Re: [..] _Singleton ()

Posté : ven. 28 déc. 2018 11:01
par DimVar
Ben ca va me donner le nom du fichier *.au3, et ?

Re: [..] _Singleton ()

Posté : ven. 28 déc. 2018 11:51
par orax
Je crois que monsieur le chat a lu trop vite ta question.
$sOccurrenceName est une chaîne quelconque, ce n'est pas forcément le nom du script.

Je compile le code suivant en A.exe et en B.exe.

Code : Tout sélectionner

_Singleton(@ScriptName)
MsgBox($MB_SYSTEMMODAL, "", "test")
Premier cas. Je n'utilise que A.exe.
  • J'exécute A.exe. Le message "test" s'affiche. Je ne ferme pas le script. À ce stade, il y a une instance de A.exe (avec $sOccurrenceName = "A.exe").
  • J'exécute à nouveau A.exe. Il y a donc deux instances de A.exe (avec $sOccurrenceName = "A.exe"). _Singleton détecte qu'il y a déjà une instance du script (avec $sOccurrenceName = "A.exe"). Le script s'arrête. Le message "test" NE s'affiche PAS.
Second cas. J'utilise A.exe et B.exe.
  • J'exécute A.exe. Le message "test" s'affiche. Je ne ferme pas le script. À ce stade, il y a une instance de A.exe (avec $sOccurrenceName = "A.exe"). Jusque là, aucun changement.
  • J'exécute B.exe. Il y a donc une instance de A.exe (avec $sOccurrenceName = "A.exe") et une instance de B.exe (avec $sOccurrenceName = "B.exe"). _Singleton voit qu'il n'y a qu'une seule instance de B.exe. Le script NE s'arrête PAS. Le message "test" s'affiche.
En général, il est donc préférable de mettre une chaîne constante pour $sOccurrenceName. Dans l'exemple du fichier d'aide, la chaîne est "test", mais une autre chaîne pourrait convenir. _Singleton("test", 1)

Re: [..] _Singleton ()

Posté : ven. 28 déc. 2018 22:21
par DimVar
Merci Orax pour les details.
J'ai du mal à appréhender "chaine constante", qu'entends tu par là ?

Re: [..] _Singleton ()  

Posté : ven. 28 déc. 2018 22:43
par orax
Je ne sais pas si le terme "chaîne constante" est bien choisi, mais il n'y a rien de compliqué. Je voulais simplement dire une chaîne de caractères qui ne varie pas d'une exécution du script à l'autre. La valeur de @ScriptName est susceptible de changer et elle n'est pas connue avant l'exécution du script. Alors que la chaîne "blabla...", par exemple, ne changera pas.

Code : Tout sélectionner

$a = "blabla..." ; chaîne de caractères "constante"
$b = @AutoItPID  ; cette valeur change à chaque exécution du script

Re: [..] _Singleton ()

Posté : sam. 29 déc. 2018 11:02
par DimVar
Ok, c'est plus clair, merci.

Re: [R] _Singleton ()

Posté : dim. 30 déc. 2018 11:49
par Tlem
Bonjour.
Si vous souhaitez éviter certains problèmes concernant le fait que le script peut avoir été renommé voir ses ressources modifiées, il serait sans doute judicieux d'utiliser une structure de ce type :

Code : Tout sélectionner

#include <Misc.au3>

; Nom utilisé pour le script : "Script Test"
Global $ScriptName = "Script Test"
Global $Error = 0

; On vérifie si le script à bien le bon nom.
If @Compiled Then
	If @ScriptName <> $ScriptName & ".exe" Then $Error = 1
Else
	If @ScriptName <> $ScriptName & ".au3" Then $Error = 1
EndIf
If $Error = 1 Then
	MsgBox(16, "Erreur", "Ce programme a été renommé ! Pour qu'il fonctionne correctement, veuillez remettre le nom d'origine : " & $ScriptName)
	Exit
EndIf

; Test Singleton pour $ScriptName
If _Singleton($ScriptName, 1) = 0 Then
	MsgBox(16, "Attention", @ScriptName & " est déjà lancé et en cours de fonctionnement ! La fonction _Singleton() n’autorise qu'une seul instance du script.")
	Exit
EndIf

MsgBox(32, @ScriptName, "Gardez cette fenêtre ouverte et lancez le script une seconde fois pour voir le résultat de la fonction _Singleton()")

Si le nom du script importe peut, comme l'a déjà dit Orax, il vous suffit d'utiliser la variable @ScriptName.

Code : Tout sélectionner

#include <Misc.au3>

; Test Singleton pour @ScriptName
If _Singleton(@ScriptName, 1) = 0 Then
	MsgBox(16, "Attention", @ScriptName & " est déjà lancé et en cours de fonctionnement ! La fonction _Singleton() n’autorise qu'une seul instance du script.")
	Exit
EndIf

MsgBox(32, @ScriptName, "Gardez cette fenêtre ouverte et lancez le script une seconde fois pour voir le résultat de la fonction _Singleton()")