Page 1 sur 1

[R] GuigetMsg vs GUIRegisterMsg performance

Posté : ven. 03 avr. 2015 16:36
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
 

Re: [..] GuigetMsg vs GUIRegisterMsg performance

Posté : ven. 03 avr. 2015 22:02
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)

Re: [..] GuigetMsg vs GUIRegisterMsg performance

Posté : ven. 03 avr. 2015 23:23
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.

Re: [..] GuigetMsg vs GUIRegisterMsg performance

Posté : sam. 04 avr. 2015 00:26
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:

Re: [R] GuigetMsg vs GUIRegisterMsg performance

Posté : sam. 04 avr. 2015 07:39
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

Re: [R] GuigetMsg vs GUIRegisterMsg performance

Posté : sam. 04 avr. 2015 11:49
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)

Re: [R] GuigetMsg vs GUIRegisterMsg performance

Posté : sam. 04 avr. 2015 18:59
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 ?

Re: [R] GuigetMsg vs GUIRegisterMsg performance

Posté : sam. 04 avr. 2015 22:28
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