[R] GUI - Fonction GUICtrlSetState (3 phases)

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Zaibai
Niveau 2
Niveau 2
Messages : 17
Enregistré le : mer. 28 mai 2014 11:52
Status : Hors ligne

[R] GUI - Fonction GUICtrlSetState (3 phases)

#1

Message par Zaibai »

Bonjour à tous !

Le titre n'est pas forcément très explicite, voici mon (petit) problème.
Je développe une GUI avec quelques boutons/labels et je fais appel à une fonction qui les caches (hide).
Cette fonction a 3 'phases' et se déclenche via un autre bouton. (Les 3 phases sont importantes à respecter)
Mon problème est que la fonction est trop longue à s’exécuter, si on appuis deux fois sur le bouton (en ~1 secondes) la fonction ne s’exécute qu'une fois.

Pouvez-vous m'aider à optimiser ce code/cette fonction ?
Merci d'avance pour votre soutiens ! :)
► Afficher le texte
Cordialement,
Zaibai
Modifié en dernier par Zaibai le lun. 09 mars 2015 12:32, modifié 1 fois.
Avatar du membre
TomAijerrie
Niveau 5
Niveau 5
Messages : 192
Enregistré le : lun. 02 juin 2014 09:55
Localisation : Lyon
Status : Hors ligne

Re: [..] GUI - Fonction GUICtrlSetState (3 phases)

#2

Message par TomAijerrie »

Et en retirant le sleep(10) ?
Zaibai
Niveau 2
Niveau 2
Messages : 17
Enregistré le : mer. 28 mai 2014 11:52
Status : Hors ligne

Re: [..] GUI - Fonction GUICtrlSetState (3 phases)

#3

Message par Zaibai »

Bonjour,

Hélas pareil. Le problème est la fonction, pas la boucle.
Je ne vois pas comment optimiser cette fonction :/
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [..] GUI - Fonction GUICtrlSetState (3 phases)

#4

Message par timmalos »

Je ne vois pas comment optimiser votre code, qui devrait être très rapide normalement...

Déjà pour régler votre problème vous pourriez rajouter un disable avant le traitement et enable après celui ci, afin d'empecher l'utilisateur de cliquer une deuxieme fois avant la fin du premier traitement.

Code : Tout sélectionner

Case $ButtonHide
            GUICtrlSetState($ButtonHide, $GUI_DISABLE)
            ButtonHideEvent()
            GUICtrlSetState($ButtonHide, $GUI_ENABLE)
Zaibai
Niveau 2
Niveau 2
Messages : 17
Enregistré le : mer. 28 mai 2014 11:52
Status : Hors ligne

Re: [..] GUI - Fonction GUICtrlSetState (3 phases)

#5

Message par Zaibai »

J'ai trouvé quel était le problème...
La fonction s’exécute bien rapidement !

En cliquant trop vite, il détecte un double clique et donc n’appuie qu'une fois sur le bouton au lieux de deux.
Le problème n'est pas très gênant, mais est-il possible de le régler ? (Via un code AutoIt bien évidement).

J'ai trouvé que ça venait de là suite à la configuration de la vitesse du double clique (via panneau de configuration).
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] GUI - Fonction GUICtrlSetState (3 phases)

#6

Message par jguinch »

Si le problème est résolu, merci de passer le titre du premier message en [R]
Arf, désolé, j'ai lu trop vite...
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [..] GUI - Fonction GUICtrlSetState (3 phases)

#7

Message par timmalos »

Y'a certainement moyen de capturer le DBLCLICK et d'effectuer deux fois votre fonction au lieu d'une, je regarderai un peu plus tard dans l'aprem
Zaibai
Niveau 2
Niveau 2
Messages : 17
Enregistré le : mer. 28 mai 2014 11:52
Status : Hors ligne

Re: [..] GUI - Fonction GUICtrlSetState (3 phases)

#8

Message par Zaibai »

@jguinch: J'ai trouvé le "réelle" problème, pas la solution.
@timmalos: Merci beaucoup, je vais aussi regarder de mon côté !
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

Re: [..] GUI - Fonction GUICtrlSetState (3 phases)

#9

Message par Patrick22 »

Je vois pas bien où est le problème. J'ai repris ton code et complété la GUI pour le faire fonctionner. J'obtiens des réponses instantanées. :o
► Afficher le texte
Voilà les durées obtenues, en secondes :

Code : Tout sélectionner

$ButtonHideEvent = 0 -> 0
$ButtonHideEvent = 1 -> 0.15
$ButtonHideEvent = 2 -> 0.13
$ButtonHideEvent = 0 -> 0.15
$ButtonHideEvent = 1 -> 0.14
$ButtonHideEvent = 2 -> 0.15
$ButtonHideEvent = 0 -> 0.15
$ButtonHideEvent = 1 -> 0.15
$ButtonHideEvent = 2 -> 0.14
$ButtonHideEvent = 0 -> 0.15
$ButtonHideEvent = 1 -> 0.14
:?:
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] GUI - Fonction GUICtrlSetState (3 phases)

#10

Message par orax »

Il faudrait enlever le Sleep dans la boucle While. Il ne sert à rien avec GUIGetMsg().

Code : Tout sélectionner

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            _Exit()
        Case $ButtonHide
            ButtonHideEvent()
    EndSwitch
WEnd

Code : Tout sélectionner

$ButtonHideEvent = 0 -> 0.02
$ButtonHideEvent = 1 -> 0.03
$ButtonHideEvent = 2 -> 0.04
:P
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] GUI - Fonction GUICtrlSetState (3 phases)

#11

Message par jguinch »

Pour intercepter le double clic, ça se passe dans WM_COMMAND.
Un petit exemple :
► Afficher le texte
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Zaibai
Niveau 2
Niveau 2
Messages : 17
Enregistré le : mer. 28 mai 2014 11:52
Status : Hors ligne

Re: [..] GUI - Fonction GUICtrlSetState (3 phases)

#12

Message par Zaibai »

J'ai bien avancé sur le sujet et bonjour les bugs ?!

Le code de Patrick22, aucun problème ! (Pas besoin de détecter le double clique)
Le code de jguinch, code ok avec détection du double clique, mais en enlevant le $BS_NOTIFY de GUICtrlCreateButton, plus besoin de la détection du double clique.
En gros le $BS_NOTIFY ralentit considérablement le clique sur le bouton ?!

Suite à cette trouvaille, j'ai cherché dans mon code et "le ralentissement" est du au changement de couleur du bouton.
exemple on prend le code de Patrick22 et on change la couleur du bouton "$ButtonHide":
► Afficher le texte
Deux solutions s'offre à moi (je dois garder le changement de couleur):
- Soit je trouve une solution pour enlever ce "ralentissement" (de l'aide serait le bienvenue, pls ?)
- Soit j'utilise la détection du double clique.
Personnellement je préférerais trouvé comment enlever ce ralentissement.

PS: J'espère que mes explications sont claire. Testé le code ci-dessus pour mieux me comprendre :P
Oversid3
Niveau 3
Niveau 3
Messages : 45
Enregistré le : jeu. 29 janv. 2015 11:20
Status : Hors ligne

Re: [..] GUI - Fonction GUICtrlSetState (3 phases)

#13

Message par Oversid3 »

Idem je n'obtiens pas non plus de différence entre les différents step/clic.

Que doit faire ton script au final ?
Pourquoi il faut pouvoir cliquer sur ce bouton rapidement ? Tu recherche plutôt la vitesse d'exec ou un temps d'exec fixe ?
Peut-être qu'une approche différente serait à envisager pour répondre au mieux a ton besoin.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] GUI - Fonction GUICtrlSetState (3 phases)

#14

Message par mikell »

Quoi que tu mettes dans le code un double clic reste un double clic
La solution de jguinch est la seule fiable
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Zaibai
Niveau 2
Niveau 2
Messages : 17
Enregistré le : mer. 28 mai 2014 11:52
Status : Hors ligne

Re: [R] GUI - Fonction GUICtrlSetState (3 phases)

#15

Message par Zaibai »

J'aimerai juste que X clique = X Fois l’exécution de la fonction.
Avec certains paramètre, le bouton "réagis" moins vite... (voir mon message ci-dessus)
Dans ce cas là, la détection du double clique semble être obligatoire.
Si pas d'autre solution, problème résolus.
Voici le code utilisé:
► Afficher le texte
Merci pour votre soutiens 8)
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

Re: [R] GUI - Fonction GUICtrlSetState (3 phases)

#16

Message par Patrick22 »

Quoi que tu fasses, le résultat de ton code n'apparaîtra qu'après le temps nécessaire à son exécution. (Je sais c'est une évidence :wink:)
Donc, si j'ai bien compris, ton but est de faire autant de fois l'action qu'il y a eu de clics sur le bouton.

Si c'est bien cela, et que tu travailles avec GUIGetMsg(), le code que j'ai posté le fait. Inutile de capter un double-clic pour lequel tu n'as aucune action spécifique à exécuter. Si tu n'utilises pas GUIRegisterMsg(), les double-clics ne seront pas interprétés comme tels.

Dans le code précédent, remplace

Code : Tout sélectionner

Func ButtonHideEvent()
    Static $ButtonHideEvent = 0
    Static $iTimer = TimerInit()
par

Code : Tout sélectionner

Func ButtonHideEvent()
    Static $ButtonHideEvent = 0
    Static $iTimer = TimerInit()
    static $iNbClic = 0
    $iNbClic += 1
    Sleep(500)
et tous les

Code : Tout sélectionner

ConsoleWrite("$ButtonHideEvent = ...)
par

Code : Tout sélectionner

ConsoleWrite("Clic n° " & $iNbClic & " : $ButtonHideEvent = ...)
Ensuite test en comptant le nombre de clics que tu fais et tu les verras apparaître à leur heure dans la console, et avec leurs effets dans la GUI.
C'est sûr que s'il faut 0,5 s. pour exécuter un code, son effet ne pourra pas se voir avant ce délai (Je sais c'est une évidence :wink:)

Ceci dit ton code fonctionne aussi :) , je l'ai testé. Il peut cependant être source de problème parce que le code exécuté lors du clic se déroule pendant l'exécution de la fonction définie dans GUIRegisterMsg() :!: .
Il faudrait juste le modifier comme proposer à la fin de cette magnifique traduction 8) du tutoriel de GUIRegisterMsg. Il y a encore d'autres façons d'exécuter ce code en dehors de GUIRegisterMsg.

Perso, si tu travailles avec GUIGetMsg(), je ne vois pas l'intérêt de se compliquer la vie en ajoutant une fonction pour GUIRegisterMsg() :| mais bon, peut être que d'autres personnes y trouveront une raison valable.
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Répondre