[R] _Singleton ()

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 867
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

[R] _Singleton ()

#1

Message 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.
Modifié en dernier par DimVar le sam. 29 déc. 2018 11:02, modifié 1 fois.
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] _Singleton ()

#2

Message par mikell »

Essaye StringTrimRight(@ScriptName, 4)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 867
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: [..] _Singleton ()

#3

Message par DimVar »

Ben ca va me donner le nom du fichier *.au3, et ?
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] _Singleton ()

#4

Message 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)
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 867
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: [..] _Singleton ()

#5

Message par DimVar »

Merci Orax pour les details.
J'ai du mal à appréhender "chaine constante", qu'entends tu par là ?
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] _Singleton ()  

#6

Message 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
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 867
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: [..] _Singleton ()

#7

Message par DimVar »

Ok, c'est plus clair, merci.
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R] _Singleton ()

#8

Message 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()")
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre