[R] GuigetMsg vs GUIRegisterMsg performance

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
A2Energie
Niveau 5
Niveau 5
Messages : 146
Enregistré le : ven. 15 nov. 2013 20:22
Status : Hors ligne

[R] GuigetMsg vs GUIRegisterMsg performance

#1

Message par A2Energie »

Bonjour,

Voici la question que je me pose,
Quel est selon vous le plus performant et le plus réactif pour un script ?
Créer une fonction renvoyée par GuiGetMsg, puis ensuite gérer le flux important de données avec des if et switch
Ou de filtre au préalable les informations avec plusieurs GUIRegisterMsg
Car je n'ai pas réussi à trouver une méthode me permettant de comparer ces deux façons de faire.

Pour ma part, je suis parti sur la seconde solution (le GUIRegisterMsg) en me disant que les informations sont près filtrés donc moins lourd à interpréter pour la machine.
Mais ... Aucune idée s'il s'agit de la bonne solution.

Edite :
Utiliser GuiGetMsg pour gagner en performance et fiabilité.
utiliser GuiRegisterMsg pour les cas exceptionnels.


Voici par exemple :

Code : Tout sélectionner

GUIRegisterMsg($WM_NOTIFY, "FTreeAction") ; Filtre les actions sur le tableau
GUIRegisterMsg($WM_COMMAND, "FMenuAction") ; Filtre les actions sur le menu
GUIRegisterMsg($WM_INITMENU,"FMenuAction") ; Filtre les actions sur le menu

Opt("GUIOnEventMode", 1)
GUISetOnEvent($GUI_EVENT_CLOSE, "FClose", $Interface) ; Fermeture de l'interface
GUISetOnEvent($GUI_EVENT_CLOSE, "FCtrlClose", $Recherche) ; Fermeture de la recherche

; Gestion des actions
Func FClose() ; Action de fermeture
   MsgBox(0, "Fermeture", "Ca va faire noire !!", 1)
   GUIDelete()
   Exit
EndFunc

Func FCtrlClose() ; Action de fermeture
   If @GUI_WinHandle = $Recherche Then
      ; ------------
   EndIf
EndFunc

Func FTreeAction($hWnd, $iMsg, $iwParam, $ilParam) ; Action sourie sur tree
   #forceref $hWnd, $iMsg, $iwParam
   $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
   $iCode = DllStructGetData($tNMHDR, "Code")
   Switch $iCode
      Case $NM_DBLCLK ; Clique gauche double
        ; -------------
      Case $NM_RCLICK ; Clique droit simple
        ; -------------
   EndSwitch
EndFunc

Func FMenuAction($hWnd, $iMsg, $iwParam, $ilParam) ; Action sourie sur tree
   #forceref $hWnd, $iMsg, $iwParam
   If $hWnd = $Interface Then
      Switch $iwParam
         Case $MenuId[1][1]
            ; ------------
         Case $MenuId[2][1]
            ; ------------
         Case $AutreRechBtn
            ; ------------
      EndSwitch
   ElseIf $hWnd = $Info Then
      If $iMsg = 278 Then
         ; ------------
      EndIf
   EndIf
EndFunc
 
Modifié en dernier par A2Energie le sam. 04 avr. 2015 00:33, modifié 1 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] GuigetMsg vs GUIRegisterMsg performance

#2

Message par mikell »

Je ne vois pas bien ce que tu veux dire par 'filtrer'
En revanche pour la réactivité (vaudrait mieux parler de priorité en fait) il y a bien une hiérarchie : GuiRegisterMsg > OnEvent > GuiGetMsg
Voilà un petit code qui met en évidence quelques unes de ces priorités
► Afficher le texte
Disons que d'une manière générale, le mode événementiel est plus "performant" que le mode messageloop, et que le GuiRegisterMsg devrait - en principe - être réservé aux actions qui nécessitent une priorité particulièrement haute ou qui ne peuvent être définies avec suffisamment de précision dans les 2 autres modes (comme certains messages particuliers en wm_notify par exemple)
" 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
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] GuigetMsg vs GUIRegisterMsg performance

#3

Message par orax »

Tu pourrais avoir un manque de réactivité si, par exemple, en cliquant sur un bouton la fonction associée au bouton met du temps pour se terminer. => https://www.autoitscript.com/wiki/Inter ... g_function

Et également comme le dit la doc - dans les remarques - pour GUIRegisterMsg il ne faut pas de trucs bloquants. Voir l'exemple en bas de la page https://www.autoitscript.com/wiki/Tutor ... egisterMsg ; il utilise GUIGetMsg + GUIRegisterMsg car il y a un MsgBox bloquant.
Personnellement je préfère utiliser GUIRegisterMsg que si ça s'avère vraiment nécessaire.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
A2Energie
Niveau 5
Niveau 5
Messages : 146
Enregistré le : ven. 15 nov. 2013 20:22
Status : Hors ligne

Re: [..] GuigetMsg vs GUIRegisterMsg performance

#4

Message par A2Energie »

Bonjour,

Un grand merci a vos reponses très clair. :wink:
j'imaginais a tors exactement l'inverse de la réalité.

Je vais donc revoir mon code.

Je reste toujours tres impressionné par le nombre impressionnant de calcul que gère notre processeur à chaque instant, :shock:

Merci encore. :cry:
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [R] GuigetMsg vs GUIRegisterMsg performance

#5

Message par jguinch »

Perso, j'utilise GuiGetMsg pour les "petits" trucs, et le mon OnEvent pour les trucs un peu plus costauds.
Pour GUIRegisterMsg, je le réserve uniquement pour ce que je ne peux pas faire plus haut
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] GuigetMsg vs GUIRegisterMsg performance

#6

Message par mikell »

orax tu as raison, je n'ai mis des Msgbox dans mon exemple que pour la démo mais en bonne pratique j'aurais dû mettre des Consolewrite ou des Msgbox non bloquantes Image
Dans le 2ème exemple que tu cites, je n'aime pas particulièrement la vérification de variable en continu dans la boucle While principale (méthode que perso je m'efforce d'utiliser le moins possible)
" 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
walkson
Modérateur
Modérateur
Messages : 1038
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [R] GuigetMsg vs GUIRegisterMsg performance

#7

Message par walkson »

mikell a écrit : des Msgbox non bloquantes
Tu pense au tooltip et autres ?
Je me suis aperçu que dans certain cas GUIRegisterMsg passait outre les blocages style MsgBox
Dans le script ci-dessous je me suis amusé à manœuvrer un MsgBox comme une vulgaire Form et de réaliser ce que je pensais impossible. Le script n'est pas beau, ce n'était qu'un essai pour voir.
► Afficher le texte
Je n'ai pas poussé plus loin mes essais. Ce n'est peut être qu'une particularité due à un timer ?
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] GuigetMsg vs GUIRegisterMsg performance

#8

Message par mikell »

Bah à ma connaissance il n'y a que 2 moyens de faire une Msgbox non bloquante : faire une gui msgbox-like, ou faire comme le code là-dessous, ça marche très bien mais on ne peut pas intégrer de variable du script dans la msgbox
► Afficher le texte
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre